perm filename DFTP.MAC[NET,MRC]36 blob sn#420239 filedate 1979-02-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00058 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00010 00002	TITLE DFTP
C00019 00003	R1 R2 R3 R4 R5 R6 R7 R10 R11 R12 R13 R14 R15 R16 R17 X1 X2 X3 X4 IO BP FLAG UTIL STAK TCIO TCIBP TCIACB TCITLP TCITCC TCIPBP TCIPCC TCISBP TCISCC TCIMAC TCIMAN DCHOST DCSOKT DEFALO SIZBLK LBSIZE SBSIZE LHOST
C00022 00004	..SAVC ..SAVL ..SAVC ..REG ..REG ..SFLG ..REG ..SAVL ..REG ..CMCH ..CMWD ..CNUM ..IDX ..CMWD ..IDX ..IDX
C00027 00005	STLOC LSLOC WFLOC BSLOC FSLOC HLOC ERRBTS DCCHAN DDCHAN LFCHAN LDCHAN
C00030 00006	DFTP RENTER CMDNEW CMDCMD CMDM1 CMDM2 CMDM3
C00033 00007	CMDMC1 CMDMC2 CMDMC3
C00035 00008	CALO CALO1 CALO2 CATT CBIG CCHA CCON CCRE CDEL CDIR CDIR1 CDIR2 CDIR3 CDIRC CDIS CENA CEXA CEXA0 CEXP CGET CLIN CLIS CLIS1 CLIS2 CLIS3 CLISC1 CLISC2 CLOD CLOD1 CLOU Project CLOU1A CLOU1 CLOU2A CLOU2 CLOU4 CNOD CPUT CQUI CREM CREN CREN1 CREN2 CREN3 CRET CSOD CSTO CTER CTTR CUND CUTR CVER
C00045 00009	PATHNR PATHNP PATHNF PATHFR PATHFF PATHCT PATHCA PATHCC PATHLR PATHRL PATHAS PATHAD PATHAV PATHAC $PATH$ PAT$10 PAT$11 PAT$12 PAT$20 PAT$21 PAT$22 PAT$23 PAT$24 PAT$25
C00049 00010	P$I$AE P$I$DE P$I$SE P$I$TE P$I$PW P$I$CC P$I$CA P$I$CT P$I$EP P$I$VP P$IN P$ICHR P$ICHE P$ICHP P$ISA P$ISA1 P$ISA2 P$ISA3 P$ISD1 P$ISD2 P$ISD9 P$ISVS P$ISVN P$ISS P$IST P$IPON P$IPOF P$IBAD P$IREP P$IR01 P$IR02 P$IR03 P$IR04 P$IR05 P$IR06 P$IDEL P$ID00 P$ID01 P$ID02 P$ID03 P$IENR P$IEND P$IENL P$IENV P$IENC P$IENN P$IENT P$IENS P$IENZ
C00060 00011	P$PP P$PS2 P$PS1 P$PS3 P$PN P$PF P$PF0 P$PF1 P$PF2 P$PF3 P$PF4 P$PF5 P$PF6
C00063 00012	P$CP P$CPCX P$CPCT P$CPCA P$CPCC P$CPCE P$CPI P$CPI0 P$CPO P$CPQ P$CPS P$CPP P$CPE P$CPZ P$CPZ0
C00066 00013	P$LF P$LF1 P$LF3 P$LF2
C00068 00014	DALO DATT DBIG DBIG1 DBIG2 DBIG3
C00071 00015	DCHA DCHAD DCHAI DCHAI1 DCHA1A DCHAI2 DCHAI3 DCHAI4 DCHAI5 DCHAC DCHAC1 DCHAC2 DCHAC3 DCHAC4 DCHAI8
C00075 00016	DCON DCON1 DCON2 DCRE
C00076 00017	DDEL
C00078 00018	DDIR DDIRO1 DDIRO2 DDIRO3 DDIRO4 DDIRF DDIRF1 DDIRF2 DDIRF3 DD$D DD$T DD$T1 DD$T2 DD$V DD$V1 DD$V2 DD$V3
C00081 00019	DEXA DEXA1 DEXA2 DEXA3 DEXA4 DEXAE DEXA$ DEXA$1 DEXA$2 DEXA$3 DEXA$4 DEXA$5 DEXA$6 DEXA$7 DEXA$8 DEXA$9
C00085 00020	DEXP DEXP1 DEXP2 DEXP3 DEXP4
C00088 00021	DGET DGET1 DGET2 DGET$ DGET3 DGET4 DGETE GET$F GET$E GET$D DLIN DLINI DLINE
C00091 00022	DLIS DLISO1 DLISO2 DLISO3 DLISI DLISN DLISD DLISE DL$T DL$T0 DL$V DL$VL DL$VN DL$VT DL$VT1 DL$VT2 DL$VE DL$P DL$P1 DL$P2 DL$P3 DL$P4 DL$NAM DL$NAN DL$NA1 DL$NA2 DL$NA3 DL$NIN DL$NI1 DL$NI2 DL$NI3 DL$NCN DL$NC1 DL$NON DL$NO1 DL$NO2 DL$NER
C00098 00023	DPUT DPUT1 DPUT2 DPUT3 DPUT4 DPUT$1 DPUT5 DPUT6 DPUT$2 DPUT7 DPUTE
C00102 00024	DREM DREM0
C00103 00025	DREN
C00106 00026	DUND
C00108 00027	D$INIT D$IN0 D$IN3 D$IN4 D$IN2 D$IND D$INP
C00112 00028	D$CON
C00113 00029	D$HEAD D$HET1 D$HET2 D$HET3 D$HET4 D$HET5 D$HEL1 D$HEL2 D$HEL3 D$HEL4 D$HEL5 D$HEL6 D$HEL7 D$HEL8 D$HEF1 D$HEF2 D$HEF3 D$HEF4 D$HED1
C00117 00030	D$OPEN D$OP01 D$OP02 D$OP03 D$OP04 D$OP05 D$OP06 D$OP07 D$OP08 D$OP09 D$OP10
C00120 00031	D$VER D$VER1 D$VER2 D$VER$ D$VERE D$VERN
C00126 00032	D$VEX
C00128 00033	D$W$F D$W$E D$W$V D$W$Q D$WITH D$WIT1 D$WIT2 D$WIT3
C00130 00034	NETSUM NETS1 NETS2 NETS3 NETRAT
C00132 00035	RENDER RENDSL RENDPM RENDFL RENDES RENDRR RENFIP RENFIL RENFIN RENFIS RENLIN RENLNL RENLIP RENLPL RENLPF RENLPP RENLPQ RENPRE RENPRP RENPRL DEATH
C00136 00036	$TAIN$ TAIN1 TAIN5 TAIN2 TAIN3 TAIN4
C00137 00037	$TCIN$ TCII01 TCICHR TCIC01 TCIC02 TCIC03 TCIC04 TCIC05 TCIC06 TCIC07 TCIC08 TCIC09 TCIC10 TCIBAD TCIREP TCIR01 TCIQUA TCIQ01 TCIQ02 TCIQ03 TCIDEL TCIENR TCIENN TCIEND TCIE01 TCIE02 TCIE03
C00145 00038	$TSIN$ TSICHR TSIBAD TSIREP TSIR01 TSIDEL TSIENR TSIEND
C00148 00039	$TNIN$ TNICHR TNIBAD TNIREP TNIR01 TNIDEL TNIENR TNIEND TNICAL
C00151 00040	DCNIN DCNIN1 DCNIN2
C00152 00041	$NOUT$ NOUT1 NOUT2 NOUT3
C00153 00042	GETFIL GETDAT GETD1 GETD2 GETD3 GETD4 NETEIT
C00156 00043	PUTFIL PUTDAT PUTD1 PUTD2A PUTD2B PUTD3 NETEOT
C00159 00044	EXAFIL EXAF5 EXAF6 EXAF0 EXAF1 EXAF2 EXAF3
C00162 00045	ICP ICPLUZ SUICID QUIT QUIT1 CLSCHK
C00167 00046	NETOI NETOI2 NETOO NETOO2 NETC
C00169 00047	NETMSG NETMS1 NETM1A NETMS2 NETMS3 NETMS4
C00171 00048	NETFFI NETFI1 NETFI4 NETFI2 NETFI5
C00172 00049	NUTMI NUTMO NUTMOB NUTMOL NUTMOO NUTDD NUTDDL NETDSI NETDSO NUTFB NUTFB1 NUTFB2
C00175 00050	LOCOI LOCOI2 LOCOO LOCOO1 LOCOO2 LOCC LOCS
C00177 00051	LOCFFI LOCFI1 LOCFI6 LOCFI2 LOCFI7 LOCFI8 LOCFI3 LOCFI9 LCFI12 LCFI10 LCFI11 LOCFI4 LOCFI5 LOCNFI LOCNI0 LOCNI1 LOCNI6 LOCNI7 LOCNI2 LOCNI8 LOCNI9 LCNI10 LCNI11 LOCNI3 LCNI12 LOCNI4 LCNI13
C00181 00052	LOCNFO LOCNO0
C00182 00053	LUTFN LUTFN1 LUTFN2 LUTFNT
C00184 00054	LUTDS LUTDS1 LUTDS2 LUTDS3 LUTDSI LUTDSS LUTDSD LUTDSE
C00186 00055	LUTTNS
C00188 00056	LUTTSN LUTTM
C00191 00057	OOPS IOERDD IOERLF
C00193 00058	CRLF RPAREN SEMI DCIBUF DCOBUF DDCHAS ZONKER DDIBUF DDOBUF LFIBUF LFOBUF ZONKEND XJOBFF LFIPPN LFILE LFCHAS LDIR LDCHAS LDIBUF LUTDSP LUTDSF EXABUF CONECB TERBLK STTBLK CMDMOD ANCHOR LOGIN% CONTEX OPENED OPENEM FLAGDD FLAGDE FLAGFE FLAGNN FLAGTT FLAGSM DEXA$L DEXA$P DEXA$S NBUF FBUF EBUF VBUF FSBUF ESBUF ABUF UBUF1 UBUF2 GBUF1 GBUF2 NTIME NSIZE NSUM TCIPCL TCIPLP TCIPNF STSIZ STBEG
C00197 ENDMK
C⊗;
TITLE DFTP


;     The DFTP program is arranged textually thus:
;          macro definitions
;          command input routines
;          command processing (Datacomputer interface) routines
;          I/O routines
;          data area
;     The DFTP program control structure is organized thus:
;          Initialization (S$INIT-D$INIT)
;          Main Command Loop (CMDCMD-TCIN)
;            Individualized Command Routines (C***)
;              Path Specification (PATH)
;                Path Input (P$IN)
;                Datacomputer Argument Preparation (P$PP)
;                Local File Name Preparation (P$LF)
;              Individualized Datacomputer Routines (D***)
;                Common Datacomputer Routines (D$**)
;                Datacomputer Synchronization (REN***)
;                Data Transfer (GET***,PUT***,NET***,LOC***)
;     S$INIT    performs    low-level    system    initialization,
;establishing (via ICP) network connections with the Datacomputer.
;D$INIT   initializes  the  Datacomputer  session,  attaching  and
;opening and connecting ports.
;     CMDCMD is the main loop point for command processing.   TCIN
;is  the  command  recognizer,  which  associates the command name
;given  with  the  proper   command   processing   routine.    The
;individualized  command  processing  routines  (CALO, CATT, CBIG,
;CCHA, CCON, CCRE, CDEL, CDIR, CEXA, CEXP, CGET, CLIS, CPUT, CREM,
;CREN, CRET, CSTO, CUND) call the path specification routine  PATH
;with  appropriate  flags  (constraining the path to be input) and
;then  call  their  own  individualized   Datacomputer   interface
;routines (DALO, DATT, etc.).
;     PATH processes paths.  It first inputs  the  path  from  the
;terminal  in  DFTP format via P$IN, then translates the path into
;components suitable for sending to the Datacomputer (NBUF --  the
;Datacomputer  pathname,  FBUF  --  the  file  name,  EBUF  -- the
;extension, VBUF -- the version) via P$PP,  and  finally  prepares
;the local file name (for PUT and GET) via P$LF.
;     The individualized Datacomputer command  interface  routines
;send  the  Datalanguage  and data appropriate for each command to
;the Datacomputer and process the  responses  and  data  returned.
;Aiding them are routines that send commonly required Datalanguage
;(D$CON,   D$OPEN,   D$VER,   D$VEX,  D$WITH)  and  routines  that
;synchronize  with  the  Datacomputer  by  handling  the   message
;prefixes and messages sent by it (RENDER, RENDEM, RENFIP, RENLIN,
;RENLIP,  RENPRE).   The  data transfer command interface routines
;(DGET and DPUT) also call the low-level  routines  that  actually
;move  the  data  between  the  network  and  local files (GETFIL,
;GETDAT, PUTFIL, PUTDAT) and that manage the  network  connections
;(NETOI,  NETOO,  NETC,  NETDSI, NETDSO, NETMSG, NETFFI) and local
;files (LOCOI, LOCOO, LOCC, LOCS, LOCFFI, LOCNFI, LOCNFO).
;     Primitive building blocks are the macros for  routine  entry
;and  exit  (BEGINR,  RETURN, RETN, EXIT, CALLR), the terminal I/O
;routines and macros  (TBIN,  TBOUT,  TSIN,  TSOUT,  TNIN,  TNOUT,
;TAIN),  and  the  Datacomputer  I/O  routines  and macros (DCBIN,
;DCBOUT, DCSOUT, DCNIN, DCNOUT).

; "<FILE"> FILE LIST(0,55,256),CAT,B=36
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),C=1
; 	    EXTENSION STRING(0,3,79),C=1
; 	    STATUS STRING(1),F=' '
; 	    CREATIONDATE STRING(1,18,79),F='?',C=1
; 	    SAVEDATE STRING(1,18,79),F='?',C=1
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	INDEX BYTE,V=I
; 	COUNT BYTE
; 	DATA STRING(0,497,500000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(79),F=' ',D=0
; 	    EXTENSION STRING(79),F=' ',D=0
; 	    CREATIONDATE STRING(19),F=' ',D=0
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,437,1000000),B=36,D=0
; 	CHECKSUM BYTE
;     END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D=0
; 	    EXTENSION STRING(0,3,79),D=0
; 	    CREATIONDATE STRING(0,18,79),D=0
; 	    SAVEDATE STRING(0,18,79),D=0
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,497,1000000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D='	'
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D=' '
; 	    STATUS STRING(1),D='	'
; 	    CREATIONDATE STRING(1,18,79),D=' '
; 	    SAVEDATE STRING(1,18,79),D=' '
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;
;R1 R2 R3 R4 R5 R6 R7 R10 R11 R12 R13 R14 R15 R16 R17 X1 X2 X3 X4 IO BP FLAG UTIL STAK TCIO TCIBP TCIACB TCITLP TCITCC TCIPBP TCIPCC TCISBP TCISCC TCIMAC TCIMAN DCHOST DCSOKT DEFALO SIZBLK LBSIZE SBSIZE LHOST

SUBTTL Switches, definitions, etc.

IF1,<PRINTX DFTP...>
IF2,<PRINTX ...is halfway>

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	X1==1
	X2==2
	X3==3
	X4==4

;	(COMMONLY USED REGISTERS)
	IO==R5
	BP==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

IFN 0,<
.XCREF R1,R2,R3,R4,R5,R6,R7,R10,R11,R12,R13,R14,R15,R16,R17
.XCREF X1,X2,X3,X4,IO,BP,FLAG,UTIL,STAK
>;IFN 0

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200

	LBSIZE==100
	SBSIZE==20

	LHOST==13
;..SAVC ..SAVL ..SAVC ..REG ..REG ..SFLG ..REG ..SAVL ..REG ..CMCH ..CMWD ..CNUM ..IDX ..CMWD ..IDX ..IDX

SUBTTL Macros

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ STAK,ROUTIN>


DEFINE	TAIN(MSG)
<	HRRZI X1,MSG
	CALLR $TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE TCIO,[RSTR,,CLIST]
	CALLR $TCIN$>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE IO,[BUFFER,,<5*BUFS>-1]
	IFB <NOECHO>,< HRRZI UTIL,MSG>
	IFNB <NOECHO>,< HRROI UTIL,MSG>
	CALLR $TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE IO,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE IO,[MSG,,RADIX]>
	CALLR $TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE X1,REG>
	IFB <RADIX>,< HRRZI X2,↑D10>
	IFNB <RADIX>,< HRRZI X2,RADIX>
	CALLR $NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE X1,REG>
	IFB <RADIX>,< HRROI X2,↑D10>
	IFNB <RADIX>,< HRROI X2,RADIX>
	CALLR $NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI FLAG,STRING
		HRLI FLAG,FLAGS>
	CALLR $PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	CAIA
	 IDPB 0,DESTIN
	ILDB 0,SOURCE
	JUMPN 0,.-2
	MOVE SOURCE,DESTIN
	IDPB 0,SOURCE
>;SCOPY

;(e)X(pand) T(erminal) C(ommand) I(nput) L(ist)

DEFINE	XTCIL <
	..CMCH==0
	..CMWD==0
	..CNUM==0
	DEFINE TCIE (NAME, ROUTINE)
	<	..CNUM==..CNUM+1
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		IFG <..IDX-..CMCH>,<..CMCH==..IDX>
	>;TCIE
	TCIL
	..CMWD==<<<..CMCH-1>/5>+1>

	.+4+..CNUM
	..CNUM
	..CMCH
	..CMWD

	DEFINE TCIE (NAME,ROUTINE)
	<	ROUTINE
	>;TCIE
	TCIL

	DEFINE TCIE (NAME,ROUTINE)
	<	ASCII	/NAME/
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
		IFG ..IDX,<REPEAT ..IDX, <0>>
	>;TCIE
	TCIL
>;XTCIL
;STLOC LSLOC WFLOC BSLOC FSLOC HLOC ERRBTS DCCHAN DDCHAN LFCHAN LDCHAN

SUBTTL SAIL definitions

OPDEF THUD [JSP FLAG,OOPS]

OPDEF DSKPPN [047000,,400071]
OPDEF BEEP [047000,,400111]
OPDEF PTJOBX [711700,,0]
OPDEF GETLIN [051300,,0]
OPDEF SETLIN [051340,,0]
OPDEF SETACT [051640,,0]
OPDEF UOUTBF [705000,,0]

; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

DEFINE	TBIN(REG)
<	INCHWL REG
	TRZ REG,400
	TRZE REG,200
	 ANDI REG,37
	CAIL REG,"a"
	 CAILE REG,"z"
	  CAIA
	   SUBI	REG,"a"-"A"
>;TBIN

DEFINE	TBIN1(REG)
<	INCHRW REG
	TRZ REG,400
	TRZE REG,200
	 ANDI REG,37
	CAIL REG,"a"
	 CAILE REG,"z"
	  CAIA
	   SUBI	REG,"a"-"A"
>;TBIN

DEFINE TBOUT(REG)
<	CAIN REG,7
	 JRST [	MOVNI REG,1
		BEEP REG,
		JRST .+2]
	OUTCHR REG
>;TBOUT

DEFINE TSOUT(STRING)
<IRP STRING,<
	OUTSTR	STRING
>;IRP STRING
>;TSOUT

DEFINE	DCBIN(REG)
<	SOSGE DCIBUF+2
	 JRST [	CALLR NUTMI
		JRST .-1]
	ILDB REG,DCIBUF+1
	JUMPE REG,.-3
>;DCIBIN

DEFINE	DCBOUT(REG)
<	IDPB REG,DCOBUF+1
	OUT DCCHAN,
	 CAIA
	  JRST NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI X1,STRING
	CALLR NUTMO>
	OUT DCCHAN,
	 CAIA
	  JRST NETEOT>
;DFTP RENTER CMDNEW CMDCMD CMDM1 CMDM2 CMDM3

SUBTTL Main Program

DFTP:	CAI
	RESET
	OUTSTR [ASCIZ/Welcome to the wonderful world of DFTP.
/]
	MOVE STAK,[IOWD STSIZ,STBEG]	; load PDP
	MOVSI 'DSK'
	MOVEM LFCHAS+1
	SETZ
	DSKPPN
	MOVEM LFIPPN
	CALLR ICP
	CALLR D$INIT			; do DC init
	MOVE JOBFF##
	MOVEM XJOBFF
	MOVEI UTIL,CMDM2
	GETPPN
	 CAI
	HRRZS
	CAIN 'MRC'			; my autoenable hack
	 MOVEI UTIL,CMDM3
	MOVEM UTIL,CMDMOD
	JRST CMDCMD
RENTER:	MOVE STAK,[IOWD STSIZ,STBEG]
CMDNEW:	TSOUT <CRLF>
CMDCMD:	RELEASE LFCHAN,
	RELEASE DDCHAN,
	MOVE XJOBFF
	MOVEM JOBFF##
	CORE
	 JRST 4,.-1
	PTJOBX [0
		SIXBIT/DOFF/]
	SETO
	GETLIN
	CAMN [-1]			; detached?
	 EXIT
	TLO 100				; special activation
	SETLIN
	TLNE 460000			; display?
	 SKIPA R1,[[	777777,,777770	; "controls", space
			000000,,020400	; :, ?
			000000,,000000
			000001,,000000]]; ALT
	  MOVEI R1,[	-1
			-1
			-1
			-1,,600000]
	SETACT R1
	SETZM ZONKER
	MOVE [ZONKER,,ZONKER+1]
	BLT ZONKEND
	OPEN DDCHAN,DDCHAS
	 JRST [	OUTSTR [ASCIZ/?? Data channel OPEN failure ??/]
		JRST SUICID]
	OPEN LFCHAN,LFCHAS
	 JRST [	OUTSTR [ASCIZ/?? Disk channel OPEN failure ??/]
		JRST SUICID]
	INBUF LFCHAN,↑D19
	OUTBUF LFCHAN,↑D19
	JRST @CMDMOD
CMDM1:	TSOUT <[ASCIZ/*/]>
	TCIN (CMDMC1,[ASCIZ/*/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
CMDM2:	TSOUT <[ASCIZ/*/]>
	TCIN (CMDMC2,[ASCIZ/*/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
CMDM3:	TSOUT <[ASCIZ/!/]>
	TCIN (CMDMC3,[ASCIZ/!/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
;CMDMC1 CMDMC2 CMDMC3

SUBTTL Terminal Input Dispatch Tables

DEFINE TCIL <
IFG ..MODE-2,<	TCIE ALLOCATE,CALO >
		TCIE ATTACH,CATT
		TCIE BIG,CBIG
IFG ..MODE-2,<	TCIE CHANGE,CCHA >
		TCIE CONNECT,CCON
IFG ..MODE-2,<	TCIE CREATE,CCRE >
		TCIE DELETE,CDEL
		TCIE DIRECTORY,CDIR
IFG ..MODE-2,<	TCIE DISABLE,CDIS >
IFE ..MODE-2,<	TCIE ENABLE,CENA >
		TCIE EXAMINE,CEXA
		TCIE EXPUNGE,CEXP
		TCIE GET,CGET
IFG ..MODE-2,<	TCIE LINK,CLIN >
		TCIE LIST,CLIS
		TCIE LOCAL-DIRECTORY,CLOD
		TCIE LOCAL-USER,CLOU
		TCIE NO-DATALANGUAGE,CNOD
		TCIE PUT,CPUT
		TCIE QUIT,CQUI
		TCIE REMOVE,CREM
		TCIE RENUMBER,CREN
		TCIE RETRIEVE,CRET
		TCIE SHOW-DATALANGUAGE,CSOD
		TCIE STORE,CSTO
		TCIE TIME-TRANSFERS,CTTR
		TCIE UNDELETE,CUND
		TCIE UNTIME-TRANSFERS,CUTR
>;TCIL

CMDMC1:	..MODE==1
	XTCIL
CMDMC2:	..MODE==2
	XTCIL
CMDMC3:	..MODE==3
	XTCIL
;CALO CALO1 CALO2 CATT CBIG CCHA CCON CCRE CDEL CDIR CDIR1 CDIR2 CDIR3 CDIRC CDIS CENA CEXA CEXA0 CEXP CGET CLIN CLIS CLIS1 CLIS2 CLIS3 CLISC1 CLISC2 CLOD CLOD1 CLOU Project CLOU1A CLOU1 CLOU2A CLOU2 CLOU4 CNOD CPUT CQUI CREM CREN CREN1 CREN2 CREN3 CRET CSOD CSTO CTER CTTR CUND CUTR CVER

SUBTTL Top level commands

CALO:	PATH ([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
	 JRST CMDCMD
	TSOUT <[ASCIZ/ Megabits: /]>
CALO1:	TNIN ([ASCIZ/ Megabits: /])
	 JRST CMDCMD
	JUMPN IO,CALO2
	MOVEI IO,"G"-100
	TBOUT <IO>
	JRST CALO1
CALO2:	MOVEM IO,ABUF
	TSOUT <CRLF>
	CALLR DALO
	JRST CMDCMD

CATT:	PATH ([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST CMDCMD
	CALLR DATT
	JRST CMDCMD

CBIG:	PATH ([ASCIZ/ BIG /],PATHNR!PATHCA)
	 JRST CMDCMD
	CALLR DBIG
	JRST CMDCMD

CCHA:	PATH ([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST CMDCMD
	CALLR DCHA
	JRST CMDCMD

CCON:	PATH ([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
	 JRST CMDCMD
	CALLR DCON
	JRST CMDCMD

CCRE:	PATH ([ASCIZ/ CREATE /],PATHNR!PATHCA)
	 JRST CMDCMD
	CALLR DCRE
	JRST CMDCMD

CDEL:	PATH ([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST CMDCMD
	CALLR DDEL
	JRST CMDCMD

CDIR:	PATH ([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST CMDCMD
	MOVE IO,CMDMOD
	CAIN IO,CMDM3
	 JRST CDIR1
	TSOUT <[ASCIZ/**/]>
	TCIN (CDIRC,[ASCIZ/**/])
	 JRST CMDCMD
	 JRST CDIR2
	JRST CDIR3
CDIR1:	TSOUT <[ASCIZ/!!/]>
	TCIN (CDIRC,[ASCIZ/!!/])
	 JRST CMDCMD
	 JRST CDIR2
	JRST CDIR3
CDIR2:	MOVEI FLAG,DD$T
	TSOUT <[ASCIZ/TERSE/]>
CDIR3:	TSOUT <CRLF>
	CALLR DDIR
	JRST CMDCMD

CDIRC:
DEFINE TCIL <
	TCIE DELETED,DD$D
	TCIE TERSE,DD$T
	TCIE VERBOSE,DD$V
>;TCIL
	XTCIL

CDIS:	TSOUT <CRLF>
	MOVEI UTIL,CMDM2
	MOVEM UTIL,CMDMOD
	JRST CMDCMD

CENA:	TSOUT <CRLF>
	MOVEI UTIL,CMDM3
	MOVEM UTIL,CMDMOD
	JRST CMDCMD

CEXA:	PATH ([ASCIZ/ EXAMINE /],PATHNP!PATHFR!PATHAV!PATHAS)
	 JRST CMDCMD
	TSOUT <[ASCIZ/ Lines per page: /]>
	TNIN ([ASCIZ/ Lines per page: /])
	 JRST CMDCMD
	JUMPN IO,CEXA0
	SKIPN IO,DEXA$P
	 MOVEI IO,↑D20
	TNOUT <IO>
CEXA0:	MOVEM IO,DEXA$P
	TSOUT <CRLF>
	MOVE UTIL,VBUF
	LDB IO,[350700,,FBUF]
	CAIN IO,"*"
	 SETO UTIL,
	LDB IO,[350700,,EBUF]
	CAIN IO,"*"
	 SETO UTIL,
	MOVEM UTIL,DEXA$S
	CALLR DEXA
	 JRST CMDCMD
	JRST CMDCMD

CEXP:	PATH ([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST CMDCMD
	CALLR DEXP
	JRST CMDCMD

CGET:	PATH ([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST CMDCMD
	CALLR DGET
	 JRST CMDCMD
	JRST CMDCMD

CLIN:	TSOUT <CRLF>
	CALLR DLIN
	JRST CMDCMD

CLIS:	PATH ([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
	 JRST CMDCMD
	MOVE IO,CMDMOD
	CAIN IO,CMDM3
	 JRST CLIS1
	TSOUT <[ASCIZ/**/]>
	TCIN (CLISC1,[ASCIZ/**/])
	 JRST CMDCMD
	 JRST CLIS2
	JRST CLIS3
CLIS1:	TSOUT <[ASCIZ/!!/]>
	TCIN (CLISC2,[ASCIZ/!!/])
	 JRST CMDCMD
	 JRST CLIS2
	JRST CLIS3
CLIS2:	MOVEI FLAG,DL$T
	TSOUT <[ASCIZ/TERSE/]>
CLIS3:	TSOUT <CRLF>
	CALLR DLIS
	JRST CMDCMD

CLISC1:
DEFINE TCIL <
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL
CLISC2:
DEFINE TCIL <
	TCIE PROTECTION,DL$P
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL

CLOD:	TSOUT <CRLF>
	SETZM LUTDSP
CLOD1:	CALLR LUTDS
	 JRST CMDCMD
	TSOUT <[ASCIZ/ /],LUTDSF,CRLF>
	JRST CLOD1

CLOU:	OUTSTR [ASCIZ/
 Project: /]
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Project:/]
	CALLR $TSIN$
	 JRST CMDCMD
	SETZ IO,
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU1A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
CLOU1A:	HRLZI UTIL,(IO)
	JUMPN IO,CLOU1
	SETZ IO,
	DSKPPN IO,
	 CAI
	HLLZ UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU1:	OUTSTR	[ASCIZ/
 Programmer: /]
	PUSH STAK,UTIL
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Programmer:/]
	CALLR $TSIN$
	 JRST [	POP STAK,UTIL
		JRST CMDCMD]
	SETZ IO,
	POP STAK,UTIL
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU2A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
CLOU2A:	HRRI	UTIL,(IO)
	JUMPN	IO,CLOU2
	SETZ IO,
	DSKPPN IO,
	 CAI
	HRR UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU2:	TSOUT <CRLF>
	RELEAS LDCHAN,
	MOVEM UTIL,LDIR
	MOVE IO,[SIXBIT/UFD/]
	MOVEM IO,LDIR+1
	SETZM LDIR+2
	MOVE IO,[SIXBIT/  1  1/]
	MOVEM IO,LDIR+3
	MOVE IO,LFCHAS+1
	MOVEM IO,LDCHAS+1
	OPEN LDCHAN,LDCHAS
	 JRST CLOU4
	LOOKUP LDCHAN,LDIR
	 JRST CLOU4
	RELEAS LDCHAN,
	MOVEM UTIL,LFIPPN
	JRST CMDCMD
CLOU4:	OUTSTR [ASCIZ/ (No such directory)
/]
	JRST CMDCMD

CNOD:	SETZM FLAGDD
	JRST CMDNEW

CPUT:	PATH ([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST CMDCMD
	CALLR DPUT
	 JRST CMDCMD
	JRST CMDCMD

CQUI:	TAIN <[ASCIZ/ [Confirm]/]>
	 JRST CMDCMD
	 JRST CMDCMD
	JRST QUIT

CREM:	PATH ([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
	 JRST CMDCMD
	CALLR DREM
	JRST CMDCMD

CREN:	PATH ([ASCIZ/ RENUMBER /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST CMDCMD
	SKIPLE X1,VBUF
	 JRST CREN2
	JUMPL X1,CREN1
	LDB UTIL,[350700,,FBUF]
	CAIN UTIL,"*"
	 JRST CREN1
	LDB UTIL,[350700,,EBUF]
	CAIE UTIL,"*"
	 JRST CREN2
CREN1:	TSOUT <[ASCIZ/ (A version number is required if *'s are used.)/],CRLF>
	JRST CMDCMD
CREN2:	TSOUT <[ASCIZ/ New version number: /]>
	TNIN ([ASCIZ/ New version number: /])
	 JRST CMDCMD
	JUMPN IO,CREN3
	MOVEI IO,"1"
	TBOUT <IO>
	MOVEI IO,1
CREN3:	MOVEM IO,ABUF
	TSOUT <CRLF>
	CALLR DREN
	JRST CMDCMD

CRET:	PATH ([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST CMDCMD
	CALLR DGET
	 JRST CMDCMD
	JRST CMDCMD

CSOD:	SETOM FLAGDD
	JRST CMDNEW

CSTO:	PATH ([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST CMDCMD
	CALLR DPUT
	 JRST CMDCMD
	JRST CMDCMD

CTER:	SETOM FLAGNN
	SETZM FLAGDD
	SETZM FLAGTT
	JRST CMDNEW

CTTR:	SETOM FLAGTT
	JRST CMDNEW

CUND:	PATH ([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST CMDCMD
	CALLR DUND
	JRST CMDCMD

CUTR:	SETZM FLAGTT
	JRST CMDNEW

CVER:	SETZM FLAGNN
	JRST CMDNEW
;PATHNR PATHNP PATHNF PATHFR PATHFF PATHCT PATHCA PATHCC PATHLR PATHRL PATHAS PATHAD PATHAV PATHAC $PATH$ PAT$10 PAT$11 PAT$12 PAT$20 PAT$21 PAT$22 PAT$23 PAT$24 PAT$25

SUBTTL Path input and translation

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	PATHAD==000020		; ALLOW (NON-SET) DEFAULT
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR <IO,UTIL>
	MOVEI IO," "
	TBOUT <IO>
	MOVE IO,[GBUF1,,5*LBSIZE]
	SETZ UTIL,
	CALLR P$IN
	 RETURN
	PUSH STAK,IO
	MOVE IO,[GBUF1,,NBUF]
	MOVE UTIL,[FBUF,,EBUF]
	CALLR P$PP
	POP STAK,IO
	MOVEM UTIL,VBUF
	TLNN FLAG,PATHAC
	 JRST PAT$10
	TAIN <[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN SKIP,1
PAT$10:	TLNE FLAG,PATHRL!PATHLR
	 JRST PAT$11
	TSOUT <CRLF>
	RETURN SKIP,1
PAT$11:	PUSH STAK,IO
	MOVE IO,[FBUF,,EBUF]
	CALLR P$LF
	POP STAK,IO
	CAIE IO,175
	 CAIN IO," "
	  JRST PAT$20
PAT$12:	TSOUT <CRLF>
	RETURN SKIP,1
PAT$20:	TLNE FLAG,PATHLR
	 JRST PAT$21
	TLNE FLAG,PATHRL
	 JRST PAT$22
	JRST PAT$23
PAT$21:	TLNE FLAG,PATHNF
	 JRST PAT$12
	JRST PAT$23
PAT$22:	TLZ FLAG,PATHNR!PATHNP!PATHAV
PAT$23:	TSOUT <[ASCIZ/ [As] /]>
	MOVE IO,[GBUF2,,5*LBSIZE]
	MOVE UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR P$IN
	 RETURN
	TLNE FLAG,PATHLR
	 JRST PAT$24
	TLNE FLAG,PATHRL
	 JRST PAT$25
	RETURN
PAT$24:	MOVE IO,[GBUF2,,NBUF]
	MOVE UTIL,[FBUF,,EBUF]
	CALLR P$PP
	MOVEM UTIL,VBUF
	TSOUT <CRLF>
	RETURN SKIP,1
PAT$25:	MOVE IO,[GBUF2,,GBUF1]
	MOVE UTIL,[FSBUF,,ESBUF]
	CALLR P$PP
	MOVE IO,[FSBUF,,ESBUF]
	CALLR P$LF
	TSOUT <CRLF>
	ENDR SKIP,1
;P$I$AE P$I$DE P$I$SE P$I$TE P$I$PW P$I$CC P$I$CA P$I$CT P$I$EP P$I$VP P$IN P$ICHR P$ICHE P$ICHP P$ISA P$ISA1 P$ISA2 P$ISA3 P$ISD1 P$ISD2 P$ISD9 P$ISVS P$ISVN P$ISS P$IST P$IPON P$IPOF P$IBAD P$IREP P$IR01 P$IR02 P$IR03 P$IR04 P$IR05 P$IR06 P$IDEL P$ID00 P$ID01 P$ID02 P$ID03 P$IENR P$IEND P$IENL P$IENV P$IENC P$IENN P$IENT P$IENS P$IENZ

; PATH INPUT
;   IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IO -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED

P$IN:	BEGINR <BP,R10,R11,R12,R13>
	SETZ R10,
	MOVE R11,IO
	MOVE R12,UTIL
	HLR BP,IO
	HRLI BP,440700
	SETZ UTIL,
P$ICHR:	TBIN <IO>
	CAIN IO,"R"-100
	 JRST P$IREP
	CAIE IO,177
	 CAIN IO,"A"-100
	  JRST P$IDEL
	CAIE IO,"U"-100
	 CAIN IO,"X"-100
	  JRST P$IENR
	CAIN IO,15
	 JRST P$ICHR
	CAIE IO,12
	 CAIN IO,175
	  JRST P$IEND
	CAIN IO,37
	 JRST P$IEND
	CAIL IO," "
	 CAIN IO,42
	  JRST P$IBAD
	CAIE IO,47
	 TRNE R10,P$I$TE
	  JRST P$IBAD
	CAIL UTIL,(R11)
	 JRST P$IBAD
	TRNE R10,P$I$PW
	 JRST P$ICHP
	CAIN IO," "
	 JRST P$IEND
	CAIN IO,"?"
	 JRST P$IBAD
	CAIN IO,"*"
	 JRST P$ISS
	TRNE R10,P$I$VP
	 JRST P$ISVN
	CAIN IO,";"
	 JRST P$ISVS
	CAIN IO,":"
	 JRST P$IPON
	CAIN IO,"<"
	 JRST P$ISA
	CAIN IO,">"
	 JRST P$ISD1
	CAIN IO,"."
	 JRST P$ISD2
	TRNE R10,P$I$SE
	 JRST P$IBAD
	TRZ R10,P$I$AE!P$I$DE
P$ICHE:	IDPB IO,BP
	TBOUT <IO>
	AOJA UTIL,P$ICHR
P$ICHP:	CAIN IO,">"
	 JRST P$IPOF
	CAIN IO,"'"
	 JRST P$IBAD
	IDPB IO,BP
	AOJA UTIL,P$ICHR
P$ISA:	TLNN FLAG,PATHNR!PATHNP
	 JRST P$IBAD
	TRNN R10,P$I$CC
	 JRST P$ISA1
	TRNN R10,P$I$CA
	 JRST P$ISA2
	TRNN R10,P$I$CT
	 JRST P$ISA3
	JRST P$IBAD
P$ISA1:	JUMPN UTIL,P$IBAD
	TRO R10,P$I$AE!P$I$CC
	JRST P$ICHE
P$ISA2:	CAIE UTIL,1
	 JRST P$IBAD
	TRO R10,P$I$AE!P$I$CA
	JRST P$ICHE
P$ISA3:	CAIE UTIL,2
	 JRST P$IBAD
	TRO R10,P$I$AE!P$I$CT
	JRST P$ICHE
P$ISD1:	TLNE FLAG,PATHNR!PATHNP
	 TRNE R10,P$I$AE!P$I$EP
	  JRST P$IBAD
	JUMPE UTIL,P$IBAD
	TLNE FLAG,PATHFR
	 TRNN R10,P$I$SE
	  TROE R10,P$I$DE
	   JRST P$IBAD
	JRST P$ISD9
P$ISD2:	TLNE FLAG,PATHFR
	 TRNE R10,P$I$AE!P$I$DE!P$I$EP
	  JRST P$IBAD
	JUMPE UTIL,P$IBAD
	TRO R10,P$I$DE!P$I$EP
P$ISD9:	TRZ R10,P$I$SE
	JRST P$ICHE
P$ISVS:	TLNE FLAG,PATHAV
	 TLNN FLAG,PATHFR
	  JRST P$IBAD
	JUMPE UTIL,P$IBAD
	TRNE R10,P$I$DE
	 TRNE R10,P$I$EP
	  TRNE R10,P$I$AE!P$I$VP
	   JRST P$IBAD
	TRZ R10,P$I$SE!P$I$EP
	TRO R10,P$I$VP!P$I$DE
	JRST P$ICHE
P$ISVN:	CAIL IO,"0"
	 CAILE IO,"9"
	  JRST P$IBAD
	TRNE R10,P$I$SE
	 JRST P$IBAD
	TRZ R10,P$I$DE
	JRST P$ICHE
P$ISS:	TLNN FLAG,PATHAS
	 JRST P$IBAD
	TRNE R10,P$I$SE
	 JRST P$IST
	TRZN R10,P$I$AE!P$I$DE
	 JUMPN UTIL,P$IBAD
	TRO R10,P$I$SE
	JRST P$ICHE
P$IST:	TLNN FLAG,PATHFR
	 TRNN R10,P$I$EP!P$I$VP
	  JRST P$IBAD
	TRO R10,P$I$TE
	JRST P$ICHE
P$IPON:	TLNE FLAG,PATHNR!PATHNP
	 TRNE R10,P$I$AE!P$I$DE!P$I$SE
	  JRST P$IBAD
	CAIL UTIL,-1(R11)
	 JRST P$IBAD
	IDPB IO,BP
	TBOUT <IO>
	MOVEI X1,"P"-100
	IDPB X1,BP
	ADDI UTIL,2
	TRO R10,P$I$PW
	JRST P$ICHR
P$IPOF:	CAIL UTIL,-1(R11)
	 JRST P$IBAD
	MOVEI X1,"P"-100
	IDPB X1,BP
	IDPB IO,BP
	TBOUT <IO>
	ADDI UTIL,2
	TRZ R10,P$I$PW
	TRO R10,P$I$DE
	JRST P$ICHR
P$IBAD:	MOVEI IO,"G"-100
	TBOUT <IO>
	JRST P$ICHR
P$IREP:	TSOUT <CRLF>
	TSOUT <(FLAG)>
	JUMPE R12,P$IR04
	HLR R13,R12
	HRLI R13,440700
	TRZ R10,P$I$PW
P$IR01:	ILDB IO,R13
	JUMPE IO,P$IR03
	CAIN IO,"P"-100
	 JRST P$IR02
	TRNE R10,P$I$PW
	 JRST P$IR01
	TBOUT <IO>
	JRST P$IR01
P$IR02:	TRC R10,P$I$PW
	JRST P$IR01
P$IR03:	TSOUT <(R12)>
P$IR04:	HRRZI IO,(BP)
	HLR R13,R11
	CAIGE IO,(R13)
	 JRST P$ICHR
	HRLI R13,440700
	TRZ R10,P$I$PW
P$IR05:	CAMN R13,BP
	 JRST P$ICHR
	ILDB IO,R13
	CAIN IO,"P"-100
	 JRST P$IR06
	TRNE R10,P$I$PW
	 JRST P$IR05
	TBOUT <IO>
	JRST P$IR05
P$IR06:	TRC R10,P$I$PW
	JRST P$IR05
P$IDEL:	JUMPE UTIL,P$IENR
	MOVEI IO,"\"
	TBOUT <IO>
	LDB IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	CAIN IO,"P"-100
	 JRST P$ID01
	LDB X1,BP
	CAIN X1,"P"-100
	 JRST P$ID02
	TRNE R10,P$I$PW
	 SOJA UTIL,P$ICHR
	TBOUT <IO>
	TRZ R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN IO,"."
	 TRZ R10,P$I$EP
	CAIN IO,";"
	 TRZ R10,P$I$VP
	CAIE IO,"<"
	 JRST P$ID00
	TRZE R10,P$I$CT
	 JRST P$ID00
	TRZE R10,P$I$CA
	 JRST P$ID00
	TRZ R10,P$I$CC
P$ID00:	SOJE UTIL,P$ICHR
	LDB X1,BP
	CAIN X1,"<"
	 TRO R10,P$I$AE
	CAIE X1,">"
	 CAIN X1,"."
	  TRO R10,P$I$DE
	CAIN X1,";"
	 TRO R10,P$I$DE
	CAIN X1,"*"
	 TRO R10,P$I$SE
	JRST P$ICHR
P$ID01:	TRZ R10,P$I$PW
	LDB IO,BP
	JRST P$ID03
P$ID02:	TROE R10,P$I$PW
	 SOJA UTIL,P$ICHR
	TRZ R10,P$I$DE
P$ID03:	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT <IO>
	SUBI UTIL,2
	JRST P$ICHR
P$IENR:	TSOUT <[ASCIZ/XXX/],CRLF>
	SETO IO,
	SETZ UTIL,
	RETURN
P$IEND:	CAIE IO,12
	 CAIN IO,37
	  JRST P$IENL
	TLNN FLAG,PATHAS
	 JRST P$IENV
	JUMPE UTIL,P$IENV
	LDB R13,BP
	CAIN R13,">"
	 JRST P$IENT
	TLNE FLAG,PATHFR
	 TLNE FLAG,PATHAS
	  JRST P$IENV
	CAIA
P$IENL:	 TLNE FLAG,PATHFR
	  TRNN R10,P$I$AE
	   JRST P$IENV
	JRST P$IBAD
P$IENV:	TRNE R10,P$I$DE
	 TRNE R10,P$I$EP
	  CAIA
	   JRST P$IBAD
	JUMPN UTIL,P$IENN
	TLNN FLAG,PATHAS
	 JRST P$IENC
	MOVE R12,[440700,,[ASCIZ/**/]]
	TLNN FLAG,PATHFR
	 JRST P$IENS
	HRRI R12,[ASCIZ/*.*/]
	TLNE FLAG,PATHAV
	 HRRI R12,[ASCIZ/*.*;*/]
	JRST P$IENS
P$IENC:	TLNN FLAG,PATHAD
	 JRST P$IBAD
	MOVE R12,[440700,,[ASCIZ/<</]]
	TLNE FLAG,PATHCC
	 HRRI R12,[ASCIZ/</]
	JRST P$IENS
P$IENN:	TLNE FLAG,PATHAS
	 TRNE R10,P$I$EP!P$I$VP
	  JRST P$IENZ
	TLNE FLAG,PATHFR
	 TRNE R10,P$I$AE!P$I$DE
	  CAIN IO,12
	   JRST P$IENZ
	CAIN IO,37
	 JRST P$IENZ
	LDB R13,BP
	CAIN R13,"<"
	 JRST P$IENT
	MOVEI R13,">"
	IDPB R13,BP
	TBOUT <R13>
	ADDI UTIL,1
P$IENT:	MOVE R12,[440700,,[ASCIZ/**/]]
	TLNN FLAG,PATHFR
	 JRST P$IENS
	HRRI R12,[ASCIZ/*.*/]
	TLNE FLAG,PATHAV
	 HRRI R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB R13,R12
	IDPB R13,BP
	JUMPE R13,RETN(1)
	TBOUT <R13>
	AOJA UTIL,P$IENS
P$IENZ:	SETZ R13,
	IDPB R13,BP
	ENDR SKIP,1
;P$PP P$PS2 P$PS1 P$PS3 P$PN P$PF P$PF0 P$PF1 P$PF2 P$PF3 P$PF4 P$PF5 P$PF6

; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IO -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR	<BP>
	TLNE	FLAG,PATHNR
	 JRST	P$PN
	HLR	BP,IO
	HRLI	BP,440700
	TLNN	FLAG,PATHNP
	 JRST	P$PF0
	SETZM	(IO)
	MOVE	X1,BP
P$PS2:	MOVE	X2,BP
P$PS1:	ILDB	X3,BP
	CAIE	X3,"<"
	 CAIN	X3,">"
	  JRST	P$PS2
	CAIE	X3,"."
	 CAIN	X3,";"
	  JRST	P$PS3
	JUMPE	X3,P$PS3
	JRST	P$PS1
P$PS3:	MOVE	BP,X2
	CAMN	BP,X1
	 JRST	P$PF
	TLO	FLAG,PATHNF
	MOVE	X1,BP
	LDB	X2,X1
	CAIN	X2,"<"
	 ILDB	X2,X1
	SETZ	X3,
	DPB	X3,X1
	PUSH	STAK,X1
	PUSH	STAK,X2
	CALLR	P$CP
	POP	STAK,X2
	POP	STAK,X1
	DPB	X2,X1
	JRST	P$PF
P$PN:	TLO	FLAG,PATHNF
	CALLR	P$CP
	RETURN
P$PF:	SKIPE	(IO)
	 JRST	P$PF0
	MOVE	X1,[440700,,CONTEX]
	MOVE	X2,[440700,,NBUF]
	SCOPY	(X1,X2)
P$PF0:	TLO	FLAG,PATHFF
	SETZM	(UTIL)
	HLRZ	X1,UTIL
	HRLI	X1,440700
P$PF1:	ILDB	X2,BP
	IDPB	X2,X1
	JUMPE	X2,P$PF3
	CAIN	X2,";"
	 JRST	P$PF4
	CAIE	X2,"."
	 JRST	P$PF1
	SETZ	X2,
	DPB	X2,X1
	HRRZI	X1,(UTIL)
	HRLI	X1,440700
P$PF2:	ILDB	X2,BP
	IDPB	X2,X1
	CAIN	X2,";"
	 JRST	P$PF4
	JUMPN	X2,P$PF2
P$PF3:	SETZ	UTIL,
	RETURN
P$PF4:	SETZ	X2,
	DPB	X2,X1
	ILDB	X2,BP
	CAIE	X2,"*"
	 JRST	P$PF5
	SETO	UTIL,
	RETURN
P$PF5:	SETZ	UTIL,
P$PF6:	SUBI	X2,"0"
	IMULI	UTIL,↑D10
	ADDI	UTIL,(X2)
	ILDB	X2,BP
	JUMPN	X2,P$PF6
	ENDR
;P$CP P$CPCX P$CPCT P$CPCA P$CPCC P$CPCE P$CPI P$CPI0 P$CPO P$CPQ P$CPS P$CPP P$CPE P$CPZ P$CPZ0

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IO -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IO,FLAG>
	MOVEI	X1,<<LBSIZE*5>-1>
	HLRZ	X2,IO
	HRLI	X2,350700
	HRRI	X3,(IO)
	HRLI	X3,440700
	LDB	IO,X2
	CAIN	IO,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCC
	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCA
	ILDB	IO,X2
P$CPCT:	MOVE	X4,[440700,,[ASCIZ/%TOP./]]
	SCOPY	(X4,X3)
	MOVE	X4,[440700,,ANCHOR]
	SCOPY	(X4,X3)
	SUBI	X1,11
	JRST	P$CPCE
P$CPCA:	MOVE	X4,[440700,,[ASCIZ/%LOGIN/]]
	SCOPY	(X4,X3)
	SUBI	X1,6
	JRST	P$CPCE
P$CPCC:	MOVE	X4,[440700,,CONTEX]
	ILDB	0,X4
	JUMPE	0,.+4
	SOJL	X1,P$CPE
	IDPB	0,X3
	JRST	.-4
	MOVE	X4,X3
	IDPB	0,X4
P$CPCE:	JUMPE	IO,P$CPZ0
	MOVEI	X4,"."
	IDPB	X4,X3
	MOVEI	X4,42
	SETZ	FLAG,
	SOJA	X1,P$CPI0
P$CPI:	ILDB	IO,X2
P$CPI0:	CAIN	IO,"P"-100
	 JRST	P$CPI
	CAIN	IO,">"
	 JRST	P$CPS
	JUMPE	IO,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IO,":"
	 JRST	P$CPP
	CAIN	IO,"*"
	 JRST	P$CPO
	CAIL	IO,"A"
	 CAILE	IO,"Z"
	  JRST	P$CPQ
P$CPO:	SOJL	X1,P$CPE
	IDPB	IO,X3
	JRST	P$CPI
P$CPQ:	SOJL	X1,P$CPE
	IDPB	X4,X3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IO,"'"
	IDPB	IO,X3
	MOVEI	IO,")"
	IDPB	IO,R3
	SETZ	FLAG,
	MOVEI	IO,"."
	JRST	P$CPO
P$CPP:	SUBI	X1,4
	JUMPL	X1,P$CPE
	MOVEI	IO,"("
	IDPB	IO,R3
	MOVEI	IO,"'"
	IDPB	IO,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,P$CPZ0
	MOVEI	X1,"'"
	IDPB	X1,X3
	MOVEI	X1,")"
	IDPB	X1,X3
P$CPZ0:	IDPB	IO,X3
	ENDR
;P$LF P$LF1 P$LF3 P$LF2

; LOCAL FILE NAME PREPARATION
;   IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR	<IO>
	HLL	X1,IO
	HRRI	X1,FSBUF
	BLT	X1,<FSBUF+SBSIZE-1>
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRLZI	X1,(IO)
	HRRI	X1,ESBUF
	BLT	X1,<ESBUF+SBSIZE-1>
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	HLR	X1,IO
	HRLI	X1,440700
	MOVE	X2,[440700,,ABUF]
P$LF1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,P$LF1
	SKIPN	(IO)
	 JRST	P$LF2
	MOVEI	X3,"."
	DPB	X3,X2
	HRRZI	X1,(IO)
	HRLI	X1,440700
P$LF3:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,P$LF3
P$LF2:
	HRRZI	IO,ABUF
	CALLR	LUTFN
	ENDR
;DALO DATT DBIG DBIG1 DBIG2 DBIG3

SUBTTL Datacomputer interface routines

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SETZM	LOGIN%
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DBIG -- CREATE A <BIG> FILE
;
DBIG:	BEGINR	<IO>
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DBIG1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DBIG2
DBIG1:	TSOUT	<[ASCIZ/ [New Node]/],CRLF>
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DBIG2:	SKIPN	OPENED
	 JRST	DBIG3
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	SETZM	OPENED
DBIG3:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<BIG">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,CONTEX]
	SCOPY	(X1,X2)
	ENDR
;DCHA DCHAD DCHAI DCHAI1 DCHA1A DCHAI2 DCHAI3 DCHAI4 DCHAI5 DCHAC DCHAC1 DCHAC2 DCHAC3 DCHAC4 DCHAI8

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR <IO,UTIL>
	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
DCHAD:	DCSOUT <[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAIA
	  JRST DCHAD
	TSOUT <[ASCIZ/ [Ok]/],CRLF>
DCHAI:	TAIN <[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM ABUF		; WRITE FLAG
	SETZM <ABUF+1>		; HOST
	SETZM <ABUF+2>		; SOCKET
	SETOM <ABUF+3>		; PASSWORD
	TAIN <[ASCIZ/  Allow control? /]>
	 JRST DCHAI
	 SETOM ABUF
	TAIN <[ASCIZ/  Restrict via network? /]>
	 JRST DCHAI
	 JRST DCHAI5
DCHAI1:	TSOUT <[ASCIZ/   Host number (octal): /]>
	TNIN ([ASCIZ/   Host number (octal): /],10)
	 JRST DCHAI
	JUMPN IO,DCHA1A
	MOVEI IO,LHOST
	TNOUT (IO,10)
DCHA1A:	TSOUT <CRLF>
DCHAI2:	MOVEM IO,<ABUF+1>
	CAIN IO,LHOST
	 JRST DCHAI3
	TSOUT <[ASCIZ/   Socket number (octal): /]>
	TNIN ([ASCIZ/   Socket number (octal): /],10)
	 JRST DCHAI
	JRST DCHAI4
DCHAI3:	SETZ IO,
DCHAI4:	MOVEM IO,<ABUF+2>
	TSOUT <CRLF>
DCHAI5:	TAIN <[ASCIZ/  Restrict via password? /]>
	 JRST DCHAI
	 JRST DCHAC
	TSOUT <[ASCIZ/   Password: /]>
	TSIN (<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST DCHAI
	TSOUT <CRLF>
DCHAC:	DCSOUT <[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE ABUF
	 JRST DCHAC1
	DCSOUT <[ASCIZ/CWA/]>
DCHAC1:	SKIPN <ABUF+1>
	 JRST DCHAC3
	DCSOUT <<[ASCIZ/,H=/]>>
	MOVE IO,<ABUF+1>
	DCNOUT <IO>
	DCSOUT <<[ASCIZ/,S=/]>>
	MOVE IO,<ABUF+2>
	JUMPE IO,DCHAC2
	DCNOUT <IO>
	JRST DCHAC3
DCHAC2:	DCSOUT <[ASCIZ/ANY/]>
DCHAC3:	SETO IO,
	CAMN IO,<ABUF+3>
	 JRST DCHAC4
	DCSOUT <<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	TSOUT <[ASCIZ/  [Ok]/],CRLF>
	JRST DCHAI
DCHAI8:	TSOUT <[ASCIZ/ (User not found)/],CRLF>
	JRST DCHAI
	ENDR
;DCON DCON1 DCON2 DCRE

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DCON2
DCON1:	TAIN	<[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,CONTEX]
	SCOPY	(X1,X2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI	IO,DEFALO
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR
;DDEL

; DDEL -- DELETE FILES
;
DDEL:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE DELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS='D'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		DELETED=DELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR
;DDIR DDIRO1 DDIRO2 DDIRO3 DDIRO4 DDIRF DDIRF1 DDIRF2 DDIRF3 DD$D DD$T DD$T1 DD$T2 DD$V DD$V1 DD$V2 DD$V3

; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IO,UTIL>
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPN	VBUF
	 SETOM	VBUF
	SETZ	UTIL,
	CAIN	FLAG,DD$D
	 JRST	DDIRO1
	CAIN	FLAG,DD$T
	 JRST	DDIRO2
	CAIN	FLAG,DD$V
	 JRST	DDIRO3
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	JRST	DDIRO4
DDIRO2:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	JRST	DDIRO4
DDIRO3:	DCSOUT	<[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ	IO,
DDIRO4:	CALLR	D$WITH
	DCSOUT	<SEMI>
	MOVE	IO,[ASCII/.I241/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
DDIRF:	CALLR	RENPRE
	CAMN	IO,[ASCII/     /]
	 JRST	DDIRF1
	CAMN	IO,[ASCII/.I261/]
	 JRST	DDIRF3
	LDB	IO,[350700,,IO]
	CAIN	IO,";"
	 JRST	DDIRF2
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR	<(FLAG)>
	AOJA	UTIL,DDIRF
DDIRF2:	CALLR	RENLIN
	JRST	DDIRF
DDIRF3:	CALLR	RENLIN
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/ [No Files]/],CRLF>
	ENDR

; DD$D -- DELETED FILES
;
DD$D:	BEGINR
	CALLR	DD$T
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T1
	MOVEI	IO,11
	TBOUT	<IO>
DD$T1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T2
	TBOUT	<IO>
DD$T2:	CAIE	IO,12
	 JRST	DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V1
	MOVEI	IO,11
	TBOUT	<IO>
DD$V1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V3
	CAIN	IO,11
	 JRST	DD$V2
	TBOUT	<IO>
	JRST	DD$V3
DD$V2:	TSOUT	<CRLF>
	TBOUT	<IO>
	TBOUT	<IO>
	JRST	DD$V1
DD$V3:	CAIE	IO,12
	 JRST	DD$V1
	ENDR
;DEXA DEXA1 DEXA2 DEXA3 DEXA4 DEXAE DEXA$ DEXA$1 DEXA$2 DEXA$3 DEXA$4 DEXA$5 DEXA$6 DEXA$7 DEXA$8 DEXA$9

; DEXA -- EXAMINE (LIST FILES TO TERMINAL)
;
DEXA:	BEGINR	<IO,FLAG>
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DEXA1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DEXA2
DEXA1:	CALLR	D$VEX
	 RETURN
DEXA2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SETZM	NSUM
	SETZM FLAGSM
DEXA3:	SETZM	DEXA$L
	CALLR	EXAFIL
	 JRST	DEXA4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	MOVNI	IO,10
	CAMN	IO,DEXA$L
	 AOJA	FLAG,DEXA4
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DEXA3
DEXA4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DEXAE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DEXAE:	CALLR	D$CON
	ENDR
; EXAMINE -- TERMINAL OUTPUT
;   IN: IO -- COUNT OF CHARACTERS IN BUFFER
;	BP -- BYTE POINTER INTO BUFFER
DEXA$:	BEGINR	<UTIL,FLAG>
	SKIPGE	DEXA$L
	 RETURN
	SETZ	FLAG,
DEXA$1:	SKIPG	IO
	 RETURN
	ILDB	UTIL,BP
	CAIGE	UTIL," "
	 JRST	DEXA$3
DEXA$2:	TBOUT	<UTIL>
	SOJA	IO,DEXA$1
DEXA$3:	CAIE	UTIL,15
	 CAIN	UTIL,11
	  JRST	DEXA$2
	CAIE	UTIL,12
	 CAIN	UTIL,37
	  JRST	DEXA$4
	CAIG	IO,5
	 JUMPE	UTIL,RETN(0)
	PUSH	STAK,UTIL
	MOVEI	UTIL,"↑"
	TBOUT	<UTIL>
	POP	STAK,UTIL
	ADDI	UTIL,100
	TBOUT	<UTIL>
	ADDI	FLAG,1
	CAIE	FLAG,20
	 SOJA	IO,DEXA$1
	JRST	DEXA$5
DEXA$4:	AOS	X1,DEXA$L
	CAML	X1,DEXA$P
	 CAIG	IO,5
	  JRST	DEXA$2
	SUBI	IO,1
	SETZM	DEXA$L
DEXA$5:	SETZ	FLAG,
	TSOUT	<CRLF,[ASCIZ/ More? /]>
DEXA$6:	TBIN1 UTIL
	CAIN	UTIL,15
	 JRST	DEXA$6
	CAIE	UTIL,"Y"
	 CAIN	UTIL,12
	  JRST	DEXA$7
	CAIE	UTIL,175
	 CAIN	UTIL,37
	  JRST	DEXA$7
	CAIN	UTIL," "
	 JRST	DEXA$7
	CAIE	UTIL,"A"
	 CAIN	UTIL,177
	  JRST	DEXA$8
	JRST	DEXA$9
DEXA$7:	TSOUT	<[ASCIZ/Yes/],CRLF>
	JRST	DEXA$1
DEXA$8:	TSOUT	<[ASCIZ/Abort/],CRLF>
	MOVNI	X1,10
	MOVEM	X1,DEXA$L
	RETURN
DEXA$9:	TSOUT	<[ASCIZ/No/],CRLF>
	SETOM	DEXA$L
	ENDR
;DEXP DEXP1 DEXP2 DEXP3 DEXP4

; DEXP -- EXPUNGE
;
DEXP:	BEGINR	<IO>
	SKIPN	OPENED
	 JRST	DEXP1
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
DEXP1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IO,[ASCII/.I280/]
	 JRST	DEXP2
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
DEXP2:	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CAIE	IO,12
	 JRST	DEXP2
	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CALLR	RENLIN
	RETURN
DEXP3:	DCBIN	<IO>
	CAIE	IO,"R"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"E"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"C"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"S"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DEXP2
	CALLR	DCNIN
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	JUMPN	IO,DEXP4
	DCSOUT	<[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DEXP4:	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	DCSOUT	<[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 CAI
	DCSOUT	<[ASCIZ/CLOSE "<">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	SETZM	OPENED
	ENDR
;DGET DGET1 DGET2 DGET$ DGET3 DGET4 DGETE GET$F GET$E GET$D DLIN DLINI DLINE

; DGET -- GET-RETRIEVE
;
DGET:	BEGINR	<IO,FLAG>
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DGET1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DGET2
DGET1:	CALLR	D$VEX
	 RETURN
DGET2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DGET$
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DGET$:	SETZM	NSUM
	SETZM FLAGSM
DGET3:	CALLR	GETFIL
	 JRST	DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR	LOCNFO
	SETZM	FLAGFE
	CALLR	LOCOO
	 SETOM	FLAGFE
	CALLR	GETDAT
	CALLR	LOCC
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DGET3
DGET4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DGETE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DGETE:	CALLR	D$CON
	ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IO,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLINE
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ/[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR
;DLIS DLISO1 DLISO2 DLISO3 DLISI DLISN DLISD DLISE DL$T DL$T0 DL$V DL$VL DL$VN DL$VT DL$VT1 DL$VT2 DL$VE DL$P DL$P1 DL$P2 DL$P3 DL$P4 DL$NAM DL$NAN DL$NA1 DL$NA2 DL$NA3 DL$NIN DL$NI1 DL$NI2 DL$NI3 DL$NCN DL$NC1 DL$NON DL$NO1 DL$NO2 DL$NER

; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR	<IO,BP,UTIL>
	CALLR	D$HEAD
	CAIN	FLAG,DL$T
	 JRST	DLISO1
	CAIN	FLAG,DL$V
	 JRST	DLISO2
	CAIN	FLAG,DL$P
	 JRST	DLISO3
	RETURN
DLISO1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST	DLISI
DLISO2:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST	DLISI
DLISO3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZ	UTIL,
	SETZM	GBUF1
	MOVE	X1,[GBUF1,,GBUF1+1]
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVEI	X1,<GBUF2+1>
	MOVEM	X1,GBUF2
	CALLR	RENPRE
	CAMN	IO,[ASCII/.I280/]
	 JRST	DLISD
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DLISN:	DCBIN	<IO>
	CAIE	IO," "
	 JRST	DLISE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DLISD
	CALLR	<(FLAG)>
	JRST	DLISN
DLISD:	CALLR	RENLIN
	CAIE	FLAG,DL$V
	 JRST	DLISN
	CALLR	DL$V
DLISE:	CAIN	IO,"?"
	 JRST	DEATH
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/  [No Nodes]/],CRLF>
	ENDR

; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR	DL$NAM
	 JRST	DL$T0
	TSOUT	CRLF
DL$T0:	CALLR	RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR
DL$VL:	DCBIN	<IO>
	CAIE	IO," "
	 RETURN
	SETO	UTIL,
	SKIPN	FLAGDD
	 JRST	DL$VN
	CALLR	RENLIN
	JRST	DL$VL
DL$VN:	CALLR	RENPRE
	CAME	IO,[ASCII/NAME=/]
	 JRST	DL$VT
	CALLR	DL$NAM
	 JRST	DL$VE
	TSOUT	CRLF
	MOVEI	FLAG,GBUF1
	SKIPE	(FLAG)
	 AOJA	FLAG,.-1
	SUBI	FLAG,GBUF1
	CALLR	RENLIN
	JRST	DL$VL
DL$VT:	MOVEM	IO,UBUF1
	SETZM	<UBUF1+1>
	MOVEI	IO,(FLAG)
DL$VT1:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$VT1
	MOVEI	IO,"]"
	TBOUT	<IO>
	TSOUT	<UBUF1>
DL$VT2:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$VT2
	JRST	DL$VL
DL$VE:	CALLR	RENLIN
	ENDR

; DL$P -- PROTECTION
;
DL$P:	BEGINR	<IO,BP>
	CALLR	DL$NAM
	 JRST	DL$P1
	TSOUT	CRLF
	CALLR	RENLIN
	RETURN
DL$P1:	MOVEI	IO,GBUF1
DL$P2:	SKIPE	(IO)
	 AOJA	IO,DL$P2
	SUBI	IO,GBUF1
DL$P3:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$P3
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$P4:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$P4
	ENDR

; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR	<BP,UTIL,FLAG,R10>
	SETZ	R10,
	SETZ	FLAG,
	MOVE	BP,[440700,,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
	DCBIN	<IO>
	CAILE	IO," "
	 JRST	DL$NA1
	RETURN
DL$NAN:	DCBIN	<IO>
DL$NA1:	CAIN	IO,"."
	 JRST	DL$NIN
	CAIG	IO," "
	 JRST	DL$NA3
	CAIE	IO,42
	 JRST	DL$NA2
	DCBIN	<IO>
DL$NA2:	IDPB	IO,BP
	SOJG	UTIL,DL$NAN
	JRST	DL$NER
DL$NA3:	SETZ	X1,
	IDPB	X1,BP
	TSOUT	<[ASCIZ/  /],ABUF>
	RETURN	SKIP,1
DL$NIN:	MOVE	BP,[440700,,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
DL$NI1:	DCBIN	<IO>
	CAIN	IO,"."
	 JRST	DL$NCN
	CAIG	IO," "
	 JRST	DL$NCN
DL$NI2:	CAIE	IO,42
	 JRST	DL$NI3
	DCBIN	<IO>
DL$NI3:	IDPB	IO,BP
	SOJG	UTIL,DL$NI1
	JRST	DL$NER
DL$NCN:	SETZ	X1,
	IDPB	X1,BP
	SKIPN	X2,GBUF1(FLAG)
	 JRST	DL$NON
	HRLI	X2,440700
	MOVE	X1,[440700,,ABUF]
DL$NC1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DL$NON
	JUMPN	X3,DL$NC1
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NON:	CAIL	FLAG,LBSIZE-2
	 JRST	DL$NER
	SETZM	GBUF1+1(FLAG)
	HRL	X1,GBUF1+1(FLAG)
	HRR	X1,GBUF1+2(FLAG)
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVE	X1,[440700,,ABUF]
	SKIPN	X2,GBUF1(FLAG)
	 HRR	X2,GBUF2
	HRLI	X2,440700
	HRRZI	BP,(BP)
	SUBI	BP,<ABUF-1>
	ADDI	BP,(X2)
	CAIL	BP,<GBUF2+LBSIZE>
	 JRST	DL$NER
	HRRZM	X2,GBUF1(FLAG)
DL$NO1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,DL$NO1
	HRRZI	X2,1(X2)
	MOVEM	X2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DL$NO2
	TSOUT	CRLF
DL$NO2:	TSOUT	<[ASCIZ/    /]>
	SOJGE	UTIL,DL$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NER:	TSOUT	<[ASCIZ/ (Pathname too long.)/],CRLF>
	ENDR
;DPUT DPUT1 DPUT2 DPUT3 DPUT4 DPUT$1 DPUT5 DPUT6 DPUT$2 DPUT7 DPUTE

; DPUT -- PUT-STORE
;
DPUT:	BEGINR	<IO>
	CALLR	LOCFFI
	 RETURN
	SKIPN	OPENED
	 JRST	DPUT3
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
DPUT1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DPUT2
	JUMPN	X3,DPUT1
	MOVEI	X1,1
	CAMN	X1,OPENEM
	 JRST	DPUT5
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT2:	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
DPUT3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DPUT4
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT4:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGNN
	 JRST	DPUT$1
	TSOUT	<[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	SETZM	VBUF
	JRST	DPUT6
DPUT5:	SETZB	IO,VBUF
	CALLR	D$VER
	 RETURN
DPUT6:	AOS	VBUF
	DCSOUT	<[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR	NETOO
	 THUD
	MOVE	IO,[ASCII/;I239/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DPUT$2
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DPUT$2:	SETZM	NSUM
	SETZM FLAGSM
	CALLR	LOCOI
	 THUD
	CALLR	NETFFI
DPUT7:	CALLR	PUTFIL
	CALLR	PUTDAT
	SKIPE	FLAGTT
	 CALLR	NETRAT
	CALLR	LOCNFI
	 JRST	DPUT7
	CALLR	NETC
	MOVE	IO,[ASCII/;I259/]
	CALLR	RENFIP
	 JRST	DPUTE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN	SKIP,1
DPUTE:	CALLR	D$CON
	ENDR
;DREM DREM0

; DREM -- DELETE NODES
;
DREM:	BEGINR
	SKIPN	OPENED
	 JRST	DREM0
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	SETZM	OPENED
DREM0:	DCSOUT	<[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 CAI
	DCSOUT	<[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  RETURN
	TSOUT	<[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	ENDR
;DREN

; DREN -- RENUMBER FILES
;
DREN:	BEGINR	<IO,UTIL>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	MOVE	UTIL,VBUF
	MOVE	IO,ABUF
	MOVEM	IO,VBUF
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE SAMEVERSION INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ SAMEVERSION=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ FOR FILES IN "<FILES">/]>
	SETZ	IO,
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  SAMEVERSION=SAMEVERSION+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF SAMEVERSION NE 0 THEN ERROR 'VERSION ALREADY EXISTS'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	MOVEM	UTIL,VBUF
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE RENUMBERED INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ RENUMBERED=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  COMMENT FILES.FILE.HEADER.FILENAME/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/   ! '.' ! FILES.FILE.HEADER.EXTENSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/    ! ';' ! FILES.FILE.HEADER.VERSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  VERSION=/]>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  RENUMBERED=RENUMBERED+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ END/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF RENUMBERED EQ 0 THEN ERROR 'NO SUCH FILE'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR
;DUND

; DUND -- UNDELETE
;
DUND:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	MOVEI	IO,"D"
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE UNDELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UNDELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS=' '
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		UNDELETED=UNDELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR
;D$INIT D$IN0 D$IN3 D$IN4 D$IN2 D$IND D$INP

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IO,BP,UTIL,FLAG>
	SETZM	FLAGDE
	SETZM	LOGIN%
	CALLR	RENDER
	 CAIA
	  JRST	D$IN0
	TSOUT	<[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
	MOVE	IO,[440700,,[ASCIZ/%TOP.DFTP.SUAI./]]
	MOVE	BP,[440700,,ABUF]
	SCOPY	(IO,BP)
	GETPPN X1,
	 CAI
	TRNN X1,770000
	 JRST [	LSH X1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM X1,UBUF1
	SETZM UBUF1+1
	MOVE	X1,[440600,,UBUF1]
	MOVEI	X2,42
D$IN3:	ILDB	X3,X1
	JUMPE	X3,D$IN4
	ADDI	X3,40
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	D$IN3
D$IN4:	MOVE	X1,BP
	IDPB	X3,X1
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	CAMN	IO,[ASCII/;O032/]
	 JRST	D$INP
	CAME	IO,[ASCII/+U107/]
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ/  [Password:/]>
	TSIN	(UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ/]/],CRLF>
	MOVE	X2,BP
	MOVEI	X1,"("
	IDPB	X1,X2
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVE	X1,[440700,,UBUF1]
	SCOPY	(X1,X2)
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVEI	X1,")"
	IDPB	X1,X2
	SETZ	X1,
	IDPB	X1,X2
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 CAIA
	  JRST	D$INP
	TSOUT	<[ASCIZ/   (Incorrect password)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE	X1,[440700,,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE	X2,[440700,,ABUF]
	SCOPY	(X1,X2)
	DCSOUT	<[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	SETZM	LOGIN%
	MOVE	UTIL,[ASCII/%LOGI/]
	MOVEM	UTIL,CONTEX
	MOVE	UTIL,[ASCII/N/]
	MOVEM	UTIL,<CONTEX+1>
	SETZM	OPENED
	CALLR	D$CON
	ENDR
;D$CON

; D$CON -- CONNECT
;
D$CON:	BEGINR	<UTIL>
	CALLR	NETDSI
	DCSOUT	<[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	CALLR	NETDSO
	DCSOUT	<[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	ENDR
;D$HEAD D$HET1 D$HET2 D$HET3 D$HET4 D$HET5 D$HEL1 D$HEL2 D$HEL3 D$HEL4 D$HEL5 D$HEL6 D$HEL7 D$HEL8 D$HEF1 D$HEF2 D$HEF3 D$HEF4 D$HED1

; D$HEAD -- PRINT HEADER FOR DDIR AND DLIS
;   IN: FLAG -- DIRECTORY DISPATCH ROUTINE
;
D$HEAD:	BEGINR	<IO,BP,UTIL>
	MOVE	IO,NBUF
	CAMN	IO,[ASCII/%TOP./]
	 JRST	D$HET1
	CAMN	IO,[ASCII/%LOGI/]
	 JRST	D$HEL1
	RETURN
D$HET1:	SKIPE	FLAGDD
	 RETURN
	TSOUT	[ASCIZ/ <<</]
	MOVE	BP,[440700,,NBUF+1]
D$HET2:	ILDB	IO,BP
	JUMPE	IO,D$HEF1
	CAIE	IO,"."
	 JRST	D$HET2
D$HET3:	ILDB	IO,BP
	JUMPE	IO,D$HEF1
	CAIN	IO,42
	 JRST	D$HET3
	CAIN	IO,"("		; ( -- PASSWORD
	 JRST	D$HET4
	CAIN	IO,"."
	 MOVEI	IO,">"
	TBOUT	<IO>
	JRST	D$HET3
D$HET4:	IBP	BP		; '
D$HET5:	ILDB	IO,BP
	JUMPE	IO,D$HEF1
	CAIN	IO,42
	 JRST	D$HET5
	CAIE	IO,"'"		; '
	 JRST	D$HET5
	IBP	BP		; )
	JRST	D$HET3
D$HEL1:	SKIPE	LOGIN%
	 JRST	D$HEL5
	DCSOUT	<[ASCIZ/LIST %LOGIN %NAME/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IO,[ASCII/.I280/]
	 JRST	D$HEL2
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
D$HEL2:	DCBIN	<IO>
	CAIN	IO,15
	 JRST	D$HEL4
	CAIE	IO,"."
	 JRST	D$HEL2
	MOVE	BP,[440700,,LOGIN%]
D$HEL3:	DCBIN	<IO>
	CAIN	IO,15
	 JRST	D$HEL4
	CAIN	IO," "
	 JRST	D$HEL4
	CAIN	IO,42
	 JRST	D$HEL3
	CAIN	IO,"."
	 MOVEI	IO,">"
	IDPB	IO,BP
	JRST	D$HEL3
D$HEL4:	SETZ	IO,
	IDPB	IO,BP
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
D$HEL5:	SKIPE	FLAGDD
	 RETURN
	TSOUT	[ASCIZ/ <<</]
	TSOUT	LOGIN%
	MOVE	BP,[260700,,NBUF+1]
	LDB	IO,BP
	JUMPE	IO,D$HEF1
	MOVEI	IO,">"
	TBOUT	<IO>
D$HEL6:	ILDB	IO,BP
	JUMPE	IO,D$HEF1
	CAIN	IO,42
	 JRST	D$HEL6
	CAIN	IO,"("		; ( -- PASSWORD
	 JRST	D$HEL7
	CAIN	IO,"."
	 MOVEI	IO,">"
	TBOUT	<IO>
	JRST	D$HEL6
D$HEL7:	IBP	BP		; '
D$HEL8:	ILDB	IO,BP
	JUMPE	IO,D$HEF1
	CAIN	IO,42
	 JRST	D$HEL8
	CAIE	IO,"'"		; '
	 JRST	D$HEL8
	IBP	BP		; )
	JRST	D$HEL6
D$HEF1:	CAIN	FLAG,DD$D
	 JRST	D$HEF2
	CAIN	FLAG,DD$T
	 JRST	D$HEF2
	CAIN	FLAG,DD$V
	 JRST	D$HEF2
	JRST	D$HED1
D$HEF2:	MOVEI	IO,">"
	TBOUT	<IO>
	TSOUT	<FBUF>
	MOVEI	IO,"."
	TBOUT	<IO>
	TSOUT	<EBUF>
	SKIPN	VBUF
	 JRST	D$HEF4
	MOVEI	IO,";"
	TBOUT	<IO>
	SKIPG	IO,VBUF
	 JRST	D$HEF3
	TNOUT	<IO>
	JRST	D$HEF4
D$HEF3:	MOVEI	IO,"*"
	TBOUT	<IO>
D$HEF4:	CAIE	FLAG,DD$D
	 JRST	D$HED1
	TSOUT	<[ASCIZ/[Deleted]/]>
D$HED1:	TSOUT	<[ASCIZ/    /]>
	DATE	IO,
	MSTIME	X1,
	IDIVI	X1,<↑D1000*↑D60>
	MOVE	UTIL,X1
	MOVE	BP,[440700,,UBUF2]
	CALLR	LUTTNS
	TSOUT	<UBUF2,CRLF>
	ENDR
;D$OPEN D$OP01 D$OP02 D$OP03 D$OP04 D$OP05 D$OP06 D$OP07 D$OP08 D$OP09 D$OP10

; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IO -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN	OPENED
	 JRST	D$OP05
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
D$OP01:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	D$OP05
	JUMPN	X3,D$OP01
	CAMN	IO,OPENEM
	 RETURN	SKIP,1
	JUMPE	IO,D$OP02
	JUMPG	IO,D$OP03
	DCSOUT	<[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST	D$OP04
D$OP02:	DCSOUT	<[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST	D$OP04
D$OP03:	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEM	IO,OPENEM
	RETURN	SKIP,1
D$OP05:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  JRST	D$OP06
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
D$OP06:	SKIPN	OPENED
	 JRST	D$OP07
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAI
	SETZM	OPENED
D$OP07:	JUMPE	IO,D$OP08
	JUMPG	IO,D$OP09
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST	D$OP10
D$OP08:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST	D$OP10
D$OP09:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEM	IO,OPENEM
	ENDR	SKIP,1
;D$VER D$VER1 D$VER2 D$VER$ D$VERE D$VERN

; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IO -- DEFAULT FLAG
;			SMALLEST UNDELETED VERSION IF < 0
;			LARGEST VERSION IF = 0
;			LARGEST DELETED VERSION IF = "D"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IO -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR	<UTIL>
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPE	IO,D$VER1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPG	IO,D$VER2
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE LEAST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	LEAST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ ' ')/],[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			IF LEAST GT VERSION THEN LEAST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! LEAST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER1:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">/]>
	CALLR	D$WITH
	DCSOUT	<[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER2:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ '/]>
	DCBOUT	<IO>
	SKIPN	FLAGDD
	 JRST	D$VER$
	TBOUT	<IO>
D$VER$:	DCSOUT	<[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
D$VERE:	MOVE	IO,[ASCII/;A282/]
	CALLR	RENFIP
	 RETURN
D$VERN:	DCBIN	<IO>
	CAIE	IO,"}"
	 JRST	D$VERN
	CALLR	DCNIN
	MOVEM	IO,VBUF
	CALLR	RENLIN
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1
;D$VEX

; D$VEX -- VERIFY THAT VERSION EXISTS
;
D$VEX:	BEGINR	<IO>
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE EXTANT INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	EXTANT=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (VERSION EQ /]>
	MOVE	IO,VBUF
	DCNOUT	<IO>
	DCSOUT	<RPAREN>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		AND (STATUS EQ ' ')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			EXTANT=EXTANT+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1
;D$W$F D$W$E D$W$V D$W$Q D$WITH D$WIT1 D$WIT2 D$WIT3

; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR	<UTIL,FLAG>
	SETZ	FLAG,
	LDB	UTIL,[350700,,FBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$F
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$E
	SKIPLE	VBUF
	 TRO	FLAG,D$W$V
	SKIPE	IO
	 TRO	FLAG,D$W$Q
	JUMPE	FLAG,RETN(0)
	DCSOUT	<[ASCIZ/ WITH/]>
	TRNN	FLAG,D$W$F
	 JRST	D$WIT1
	DCSOUT	<[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT1:	TRNN	FLAG,D$W$E
	 JRST	D$WIT2
	DCSOUT	<[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT2:	TRNN	FLAG,D$W$V
	 JRST	D$WIT3
	DCSOUT	<[ASCIZ/ VERSION EQ /]>
	MOVE	UTIL,VBUF
	DCNOUT	<UTIL>
	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT3:	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<(IO)>
	ENDR
;NETSUM NETS1 NETS2 NETS3 NETRAT

; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR	<IO,FLAG>
	CALLR	RENPRE
	CAME	IO,[ASCII/;I275/]
	 JRST	NETS2
	SETZ	FLAG,
NETS1:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	NETS1
	SKIPN	FLAG
	 SOJA	FLAG,NETS1
	CALLR	DCNIN
	CAME	IO,NSUM
	 JRST	NETS3
	CALLR	RENLIN
	RETURN
NETS2:	CALLR	RENLIP
	RETURN
NETS3:	CALLR	RENLIN
	TSOUT	<[ASCIZ/ (Network Checksum Error)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR	<IO,<IO+1>>
	TSOUT	<[ASCIZ/ (/]>
	MOVEI	IO,↑D36
	IMULB	IO,NSIZE
	IDIV	IO,NTIME
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ Baud (/]>
	MOVE	IO,NSIZE
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ bits in /]>
	SKIPN	IO,NTIME
	 MOVEI	IO,1
	TNOUT	<IO>
	HRRZI	<IO+1>,[ASCIZ/ seconds))/]
	CAIN	IO,1
	 HRRZI	<IO+1>,[ASCIZ/ second))/]
	TSOUT	<(IO+1),CRLF>
	ENDR
;RENDER RENDSL RENDPM RENDFL RENDES RENDRR RENFIP RENFIL RENFIN RENFIS RENLIN RENLNL RENLIP RENLPL RENLPF RENLPP RENLPQ RENPRE RENPRP RENPRL DEATH

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IO,UTIL,FLAG>
	SETZ	FLAG,
RENDSL:	CALLR	RENPRE
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENDES
	CAMN	IO,[ASCII/.I210/]
	 JRST	RENDRR
	CAME	IO,[ASCII/;A282/]
	 CAMN	IO,[ASCII/.J151/]
	  JRST	RENDPM
	LDB	UTIL,[350700,,IO]
	CAIE	UTIL,"+"
	 CAIN	UTIL,"-"
	  CAIA
	   JRST	RENDFL
	SETO	FLAG,
	SKIPN	FLAGDE
	 JRST	RENDFL
	SETZM	FLAGDE
RENDPM:	CALLR	RENLIP
	JRST	RENDSL
RENDFL:	CALLR	RENLIN
	JRST	RENDSL
RENDES:	CALLR	RENLIN
	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETO	FLAG,
	JRST	RENDSL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IO -- PREFIX
;
RENFIP:	BEGINR	<BP,UTIL,FLAG>
	MOVE	FLAG,IO
	SETZ	UTIL,
RENFIL:	CALLR	RENPRE
	CAMN	IO,FLAG
	 RETURN	SKIP,1
	LDB	BP,[350700,,IO]
	CAIE	BP,";"
	 CAIN	BP,"."
	  JRST	RENFIN
	SKIPN	UTIL
	 CALLR	RENLIP
	SKIPE	UTIL
	 CALLR	RENLIN
	AOJA	UTIL,RENFIL
RENFIN:	CALLR	RENLIN
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENFIS
	CAMN	IO,[ASCII/.I210/]
	 RETURN
	JRST	RENFIL
RENFIS:	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IO>
RENLNL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IO>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IO>
	CAIN	IO,12
	 RETURN
	CAIE	IO,11
	 JRST	RENLPF
	MOVEI	IO," "
	TBOUT	<IO>
	MOVEI	IO,"("
RENLPP:	TBOUT	<IO>
RENLPQ:	DCBIN	<IO>
	CAIN	IO,42
	 JRST	RENLPQ
	CAIE	IO,15
	 JRST	RENLPP
	DCBIN	<IO>
	MOVEI	IO,")"
	TBOUT	<IO>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BP,UTIL,FLAG>
RENPRP:	SETZ	IO,
	MOVE	BP,[440700,,IO]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIE	UTIL,15
	 CAIN	UTIL,12
	  JRST	RENPRL
	IDPB	UTIL,BP
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	SKIPN	FLAGNN
	 CALLR	RENLIP
	JRST	RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
	JRST SUICID
;$TAIN$ TAIN1 TAIN5 TAIN2 TAIN3 TAIN4

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IO>
TAIN1:	MOVEI	IO,(X1)
	TSOUT	<(IO)>
TAIN5:	TBIN1 IO
	CAIN	IO,15
	 JRST	TAIN5
	CAIN	IO,"R"-100
	 JRST	TAIN1
	CAIN	IO,"N"
	 JRST	TAIN2
	CAIN	IO,"Y"
	 JRST	TAIN3
	CAIE	IO,12
	 CAIN	IO,175
	  JRST	TAIN4
	CAIE	IO,37
	 CAIN	IO," "
	  JRST	TAIN4
	TSOUT	<[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT	<[ASCIZ/No/],CRLF>
	RETURN	SKIP,1
TAIN3:	TSOUT	<[ASCIZ/Yes/]>
TAIN4:	TSOUT	<CRLF>
	ENDR	SKIP,2
;$TCIN$ TCII01 TCICHR TCIC01 TCIC02 TCIC03 TCIC04 TCIC05 TCIC06 TCIC07 TCIC08 TCIC09 TCIC10 TCIBAD TCIREP TCIR01 TCIQUA TCIQ01 TCIQ02 TCIQ03 TCIDEL TCIENR TCIENN TCIEND TCIE01 TCIE02 TCIE03

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A AND RUBOUT DELETE THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND ↑U DELETE THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[440700,,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIE	TCIO,177
	 CAIN	TCIO,"A"-100
	  JRST	TCIDEL
	CAIE	TCIO,"U"-100
	 CAIN	TCIO,"X"-100
	  JRST	TCIENR
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIE	TCIO,12
	 CAIN	TCIO,37
	  JRST	TCIC01
	CAIE	TCIO," "
	 CAIN	TCIO,175
	  JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	AOJA	TCIMAC,TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIE	TCIO,12
	 CAIN	TCIO,37
	  JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,175
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[440700,,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIENR	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	ADD TCIBP,[070000,,0]		; BACK UP LINE BYTE PTR
	TLNE TCIBP,400000
	 SUB TCIBP,[430000,,1]
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	ADD TCISBP,[070000,,0]		; BACK UP SCAN BYTE PTR
	TLNE TCISBP,400000
	 SUB TCISBP,[430000,,1]
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2
;$TSIN$ TSICHR TSIBAD TSIREP TSIR01 TSIDEL TSIENR TSIEND

; TERMINAL STRING INPUT
;   IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BP,R10,R11,R12>
	MOVE	R10,IO
	MOVE	R11,UTIL
	HLRZ	BP,IO
	HRLI	BP,440700
	SETZ	UTIL,
TSICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TSIREP
	CAIE	IO,177
	 CAIN	IO,"A"-100
	  JRST	TSIDEL
	CAIE	IO,"U"-100
	 CAIN	IO,"X"-100
	  JRST	TSIENR
	CAIN	IO,15
	 JRST	TSICHR
	CAIE	IO,12
	 CAIN	IO,175
	  JRST	TSIEND
	CAIN	IO,37
	 JRST	TSIEND
	CAIL	IO," "
	 CAIL	UTIL,(R10)
	  JRST	TSIBAD
	IDPB	IO,BP
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IO,(BP)
	HLR	R12,R10
	CAIGE	IO,(R12)
	 JRST	TSICHR
	HRLI	R12,440700
TSIR01:	CAMN	R12,BP
	 JRST	TSICHR
	ILDB	IO,R12
	TBOUT	<IO>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BP
	ENDR	SKIP,1
;$TNIN$ TNICHR TNIBAD TNIREP TNIR01 TNIDEL TNIENR TNIEND TNICAL

; TERMINAL NUMBER INPUT
;   IN: IO -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IO -- NUMBER
;
$TNIN$:	BEGINR	<BP,UTIL,FLAG>
	MOVE	UTIL,IO
	MOVE	BP,[440700,,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TNIREP
	CAIE	IO,177
	 CAIN	IO,"A"-100
	  JRST	TNIDEL
	CAIE	IO,"U"-100
	 CAIN	IO,"X"-100
	  JRST	TNIENR
	CAIN	IO,15
	 JRST	TNICHR
	CAIE	IO,12
	 CAIN	IO,175
	  JRST	TNIEND
	CAIE	IO,37
	 CAIN	IO," "
	  JRST	TNIEND
	CAIL	IO,"0"
	 CAIL	IO,"0"(UTIL)
	  JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IO,UTIL
	TSOUT	<(IO)>
	HRRZI	IO,(BP)
	CAIGE	IO,UBUF1
	 JRST	TNICHR
	MOVE	IO,[440700,,UBUF1]
TNIR01:	CAMN	IO,BP
	 JRST	TNICHR
	ILDB	X1,IO
	TBOUT	<X1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	IO,
	RETURN
TNIEND:	SETZ	IO,
	IDPB	IO,BP
	MOVE	BP,[440700,,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BP
	JUMPE	UTIL,RETN(1)
	IMULI	IO,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IO,(UTIL)
	JRST	TNICAL
	ENDR
;DCNIN DCNIN1 DCNIN2

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IO+1>,UTIL>
	SETZ	IO,
DCNIN1:	DCBIN	<UTIL>
	CAIL	UTIL,"0"
	 CAILE	UTIL,"9"
	  RETURN
	JUMPL	IO,DCNIN2
	MULI	IO,↑D10
	CAILE	IO,1
	 JRST	DCNIN2
	CAIN	IO,1
	 TLO	<IO+1>,400000
	MOVE	IO,<IO+1>
	ADDI	IO,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IO,
	JRST	DCNIN1
	ENDR
;$NOUT$ NOUT1 NOUT2 NOUT3

; $NOUT$ -- INTEGER OUTPUT
;   IN: X1 -- INTEGER
;       X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,X2
	MOVE	X3,[440700,,UBUF1]
	MOVEI	X4,1
	JUMPGE	X1,NOUT1
	LSHC	X1,-↑D35
	LSH	X2,-1
	DIVI	X1,(FLAG)
	CAIA
NOUT1:	 IDIVI	X1,(FLAG)
	ADDI	X2,"0"
	IDPB	X2,X3
	SKIPE	X1
	 AOJA	X4,NOUT1
	SKIPA	X1,[440700,,UBUF2]
NOUT2:	ADD	X3,[070000,,0]
	TLNE	X3,400000
	 SUB	X3,[430000,,1]
	LDB	X2,X3
	IDPB	X2,X1
	SOJG	X4,NOUT2
	IDPB	X4,X1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR
;GETFIL GETDAT GETD1 GETD2 GETD3 GETD4 NETEIT

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR <IO,UTIL>
	MSTIME X1,
	IDIVI X1,↑D1000
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	CALLR NUTFB
	 RETURN
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$E,,EBUF]
	CALLR NUTFB
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$D,,ABUF]
	CALLR NUTFB
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[440700,,ABUF]
	CALLR LUTTSN
	DPB IO,[001400,,LFILE+2]
	LSH IO,-14
	DPB IO,[170300,,LFILE+1]
	DPB UTIL,[141300,,LFILE+2]
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	SKIPLE X1
	 MOVE X1,LFCHAS
	MOVMS X1
	DPB X1,[270400,,LFILE+2]
	ENDR SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR <IO,UTIL,FLAG>
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE FLAG,ABUF
	JUMPE FLAG,GETD2
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SETZ UTIL,
	SKIPE FLAGFE
	 JRST GETD3
GETD1:	SOSG DDIBUF+2
	 IN DDCHAN,
	  CAIA
	   THUD
	ILDB IO,DDIBUF+1
	ADD UTIL,IO
	SOSG LFOBUF+2
	 OUT LFCHAN,
	  CAIA
	   THUD
	IDPB IO,LFOBUF+1
	SOJG FLAG,GETD1
GETD2:	ADDM UTIL,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST GETD4
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
	JRST GETD4
GETD3:	IN DDCHAN,
	 JRST GETD3
GETD4:	MSTIME X1,
	IDIVI X1,↑D1000
	SUBM X1,NTIME
	ENDR

; FATAL NETWORK ERROR MESSAGES
;

NETEIT:	OUTSTR [ASCIZ / ?? Datacomputer closed connection ??/]
	JRST QUIT
;PUTFIL PUTDAT PUTD1 PUTD2A PUTD2B PUTD3 NETEOT

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR <IO,BP,UTIL>
	OUT DDCHAN,
	 CAIA
	  THUD
	MSTIME X1,
	IDIVI X1,↑D1000
	MOVEM X1,NTIME
	IBP DDOBUF+1
	HRR BP,DDOBUF+1
	HRLI BP,440700
	MOVE UTIL,[440700,,FBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	MOVE UTIL,[440700,,EBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	LDB IO,[001400,,LFILE+2] ; CREATION DATE
	LDB UTIL,[170300,,LFILE+1]
	LSH UTIL,14
	IORI IO,(UTIL)
	LDB UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR LUTTNS
	DATE IO,
	MSTIME X1,
	IDIVI X1,<↑D1000*↑D60>
	MOVE UTIL,X1
	CALLR LUTTNS
	HRLI BP,004400
	MOVE UTIL,VBUF
	IDPB UTIL,BP
	CALLR LOCS
	IDPB IO,BP
	LDB UTIL,[270400,,LFILE+2] ; DATA MODE
	MOVNS UTIL
	IDPB UTIL,BP
	HRRO X1,DDOBUF+1
	MOVEM BP,DDOBUF+1
	SUBI BP,-1(X1)
	HRRZM BP,NSIZE
	TLC X1,-1(BP)
	SETZ UTIL,
	ADD UTIL,(X1)
	AOBJN X1,.-1
	ADDM UTIL,NSUM
	OUT DDCHAN,
	 CAIA
	  THUD
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR <IO,UTIL>
	CALLR LOCS
	AOS NSIZE
	ADDM IO,NSUM
	ADDM IO,NSIZE
	AOS DDOBUF+1
	MOVEM IO,@DDOBUF+1
	OUT DDCHAN,
	 CAIA
	  THUD
	SETZ UTIL,
	JRST PUTD2B

PUTD1:	ILDB X1,LFIBUF+1
	ADD UTIL,X1
	SOSLE DDOBUF+2
	 JRST PUTD2A
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD3
	MOVE X1,X1SAVE#
	OUT DDCHAN,
	 JRST PUTD2A
	THUD
PUTD2A:	IDPB X1,DDOBUF+1
PUTD2B:	SOSG LFIBUF+2
	 IN LFCHAN,
	  JRST PUTD1
	AOS NSIZE
	ADDM UTIL,NSUM
	ADDM UTIL,NSUM
	AOS DDOBUF+1
	MOVEM UTIL,@DDOBUF+1
	OUT DDCHAN,
	 CAIA
	  THUD
PUTD3:	MSTIME X1,
	IDIVI X1,↑D1000
	SUBM X1,NTIME
	ENDR

; FATAL NETWORK ERROR MESSAGES
;

NETEOT:	OUTSTR [ASCIZ / ?? Datacomputer has crashed ??/]
	JRST QUIT
;EXAFIL EXAF5 EXAF6 EXAF0 EXAF1 EXAF2 EXAF3

; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR <IO,BP,FLAG,UTIL>
	MSTIME X1,
	IDIVI X1,↑D1000
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	CALLR NUTFB
	 RETURN
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$E,,EBUF]
	CALLR NUTFB
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$D,,ABUF]
	CALLR NUTFB
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE FLAG,ABUF
	JUMPE FLAG,EXAF2
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SKIPL DEXA$S
	 JRST EXAF0
	MOVE X2,[440700,,FBUF]
EXAF5:	ILDB X1,X2
	CAILE X1," "
	 JRST EXAF5
	SETZ X1,
	DPB X1,X2
	MOVE X2,[440700,,EBUF]
EXAF6:	ILDB X1,X2
	CAILE X1," "
	 JRST EXAF6
	SETZ X1,
	DPB X1,X2
	TSOUT <[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ UTIL,
EXAF1:	HRLI IO,(FLAG)
	CAIL FLAG,SIZBLK
	 HRLI IO,SIZBLK
	HRRI IO,EXABUF
	CALLR NUTFB
	MOVEI IO,(FLAG)
	CAILE IO,SIZBLK
	 MOVEI IO,SIZBLK
	SUBI FLAG,(IO)
	HRLOI X1,-1(IO)
	EQVI X1,EXABUF
	PUSH STAK,X1
	IMULI IO,5
	MOVE BP,[440700,,EXABUF]
	CALLR DEXA$
	POP STAK,X1
	ADD UTIL,(X1)
	AOBJN X1,.-1
	JUMPG FLAG,EXAF1
EXAF2:	ADDM UTIL,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST EXAF3
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
EXAF3:	MSTIME X1,
	IDIVI X1,↑D1000
	SUBM X1,NTIME
	ENDR SKIP,1
;ICP ICPLUZ SUICID QUIT QUIT1 CLSCHK

; ICP -- CONNECT TO DC
; BOY IS THIS ICP ROUTINE EVER A LOSER!!  -- MRC
ICP:	BEGINR	<IO,UTIL,FLAG>
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	SETOM CONECB+LSLOC	; GENSYM LOCAL SOCKET
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X3,↑D32
	MOVEM X3,CONECB+BSLOC
	MOVEI X3,DCSOKT
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	MOVE X2,CONECB+LSLOC
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE X3,FRS
	LSH X3,-4
	MOVEM X3,FRS
	ADDI X3,1
	MOVEM X3,FSS#
	ADDI X2,3
	MOVEM X2,LSS#
	SUBI X2,1
	MOVEM X2,LRS#
	MOVE X1,CONECB+LSLOC
	MOVEM X1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[	↑D15
			BYTE (6) 5,24,0,12,0]	; TIME OUT CLS, RFNM, AND RFC
	INBUF DCCHAN,
	OUTBUF DCCHAN,
	MOVEI X1,↑D8
	DPB X1,[300600,,DCIBUF+1]
	DPB X1,[300600,,DCOBUF+1]
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MOVE X3,FSS
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI X3,4
	MOVEM X3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,[	15		;ALLOCATE
			1]
	ENDR

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/The Datacomputer is unavailable right now.  Try again later./]
SUICID:	RESET
	EXIT

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI IO,"Z"-100
	IDPB IO,DCOBUF+1
	OUTPUT DCCHAN,
QUIT1:	SOSG DCIBUF+2
	 IN DCCHAN,
	  CAIA
	   JRST SUICID
	ILDB DCIBUF+1
	SKIPE FLAGDD
	 OUTCHR
	JRST QUIT1

; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE X1,STTBLK+1
	IOR X1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN X1,060000
	 RETURN SKIP,1
	ENDR
;NETOI NETOI2 NETOO NETOO2 NETC

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MTAPE DDCHAN,[	15		;ALLOCATE
			1]
	SETZM CONECB
	MOVE X1,LRS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FSS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
NETOI2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	SETZM CONECB
	MOVE X1,LSS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FRS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	UOUTBF DDCHAN,[	2
			4000]
	RETURN SKIP,1
NETOO2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	CLOSE DDCHAN,
	ENDR
;NETMSG NETMS1 NETM1A NETMS2 NETMS3 NETMS4

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR	<IO>
	SKIPE FLAGSM			; NETMSG allowed to gobble?
	 RETURN SKIP,1			; no!!
NETMS1:	MOVE	IO,DCIBUF+2		; check for cruft read but still
	CAILE	IO,20			;  not input by dftp
	 JRST	NETM1A			; stuff in buffer still
	HRRZ	IO,DCIBUF		; try another buffer
	HRRZ	IO,(IO)
	SKIPGE	(IO)
	 JRST	NETM1A
	MTAPE	DCCHAN,[10]		; try still in monitor
	 RETURN	SKIP,1
NETM1A:	DCBIN	<IO>
	CAIN	IO,"?"
	 JRST	DEATH
	CAIN	IO,"!"
	 JRST	NETMS2
	CAIE	IO,"+"
	 CAIN	IO,"-"
	  JRST	NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM FLAGSM
	CALLR RENLIN
	ENDR SKIP,1
;NETFFI NETFI1 NETFI4 NETFI2 NETFI5

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
	  CAIA
	   JRST	NETFI1
	TSOUT	<[ASCIZ/ (/],LUTDSF,RPAREN>
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	MOVE	X1,[440600,,LFILE]
	MOVEI	X2,6
	MOVE	X3,[440700,,FBUF]
NETFI4:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,NETFI4
NETFI2:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[440600,,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[440700,,EBUF]
NETFI5:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,NETFI5
	ENDR
;NUTMI NUTMO NUTMOB NUTMOL NUTMOO NUTDD NUTDDL NETDSI NETDSO NUTFB NUTFB1 NUTFB2

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 CAIA
	  JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IO,BP>
	SKIPE	FLAGDD
	 OUTSTR (X1)
	MOVEI	BP,(X1)
	TLOA	BP,440700
NUTMOB:	 IDPB	IO,DCOBUF+1
	ILDB	IO,BP
	JUMPE	IO,RETN(0)
NUTMOL:	SOSL	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	NUTMOL
	JRST	NETEOT
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IO,UTIL>
	MOVE	X1,DCIBUF+1
	MOVE	UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IO,X1
	JUMPE	IO,NUTDDL
	TBOUT	IO
	JRST	NUTDDL
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	MOVE UTIL,LRS
	ADDI UTIL,2
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	MOVE UTIL,LSS
	ADDI UTIL,2
	ENDR

; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	SKIPGE X1,IO
	 JRST NUTFB1
	HLRZ X1,IO
	MOVNS X1
	HRLS X1
	HRR X1,IO
NUTFB1:	SOSG DDIBUF+2
	 IN DDCHAN,
	  JRST NUTFB2
	SKIPGE IO
	 STATO	DDCHAN,020000
	  THUD
	RETURN
NUTFB2:	ILDB X2,DDIBUF+1
	MOVEM X2,(X1)
	AOBJN X1,NUTFB1
	SKIPL IO
	 RETURN
	ENDR SKIP,1
;LOCOI LOCOI2 LOCOO LOCOO1 LOCOO2 LOCC LOCS

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR <IO>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3	; MUST SETUP FOR SAIL PPN'S
	LOOKUP LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST LOCOI2
	RETURN SKIP,1
LOCOI2:	OUTSTR [ASCIZ / (Local file not found)
/]
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR <IO,<IO+1>>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3	; MUST SETUP FOR SAIL PPN'S
	DMOVE IO,<LFILE+1>
	LOOKUP LFCHAN,LFILE
	 JRST LOCOO1
	CLOSE LFCHAN,
	TAIN <[ASCIZ / [Old Local File][Confirm]/]>
	 RETURN
	 RETURN
LOCOO1:	DMOVEM IO,<LFILE+1>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3
	ENTER LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST LOCOO2
	RETURN SKIP,1
LOCOO2:	OUTSTR [ASCIZ/ (Local file creation failure)
/]
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE FLAGFE
	 RETURN
	CLOSE LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
	MOVS IO,LFILE+3		; - LENGTH
	MOVNS IO		; + LENGTH
	ENDR
;LOCFFI LOCFI1 LOCFI6 LOCFI2 LOCFI7 LOCFI8 LOCFI3 LOCFI9 LCFI12 LCFI10 LCFI11 LOCFI4 LOCFI5 LOCNFI LOCNI0 LOCNI1 LOCNI6 LOCNI7 LOCNI2 LOCNI8 LOCNI9 LCNI10 LCNI11 LOCNI3 LCNI12 LOCNI4 LCNI13

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR	<IO>
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
	  CAIA
	   JRST	LOCFI5
	SETZM	LUTDSP
LOCFI1:	CALLR	LUTDS
	 CAIA
	  JRST	LOCFI6
	OUTSTR	[ASCIZ/ (No such file)
/]
	RETURN
LOCFI6:	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCFI2
	CAME	X1,ESBUF
	 JRST	LOCFI3
	JRST	LOCFI4
LOCFI2:	MOVE	X1,[440700,,FSBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCFI7:	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,LOCFI8
	CAIN	X3,(X4)
	 JRST	LOCFI7
	JRST	LOCFI1
LOCFI8:	JUMPE	X4,LOCFI4
	CAIN	X4,"."
	 JRST	LOCFI4
	JRST	LOCFI1
LOCFI3:	MOVE	X1,[440700,,ESBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCFI9:	ILDB	X4,X2
	JUMPE	X4,LCFI10
	CAIE	X4,"."
	 JRST	LOCFI9
LCFI12:	ILDB	X4,X2
LCFI10:	ILDB	X3,X1
	JUMPE	X3,LCFI11
	CAIN	X3,(X4)
	 JRST	LCFI12
	JRST	LOCFI1
LCFI11:	JUMPE	X4,LOCFI4
	JRST	LOCFI1
LOCFI4:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
LOCFI5:	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR	<IO>
	CALLR	LOCC
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
LOCNI0:	  CALLR	LUTDS
	   RETURN SKIP,1
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCNI1
	CAME	X1,ESBUF
	 JRST	LOCNI2
	JRST	LOCNI3
LOCNI1:	MOVE	X1,[440700,,FSBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCNI6:	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,LOCNI7
	CAIN	X3,(X4)
	 JRST	LOCNI6
	JRST	LOCNI0
LOCNI7:	JUMPE	X4,LOCNI3
	CAIN	X4,"."
	 JRST	LOCNI3
	JRST	LOCNI0
LOCNI2:	MOVE	X1,[440700,,ESBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCNI8:	ILDB	X4,X2
	JUMPE	X4,LCNI10
	CAIE	X4,"."
	 JRST	LOCNI8
LOCNI9:	ILDB	X4,X2
LCNI10:	ILDB	X3,X1
	JUMPE	X3,LCNI11
	CAIN	X3,(X4)
	 JRST	LOCNI9
	JRST	LOCNI0
LCNI11:	JUMPE	X4,LOCNI3
	JRST	LOCNI0
LOCNI3:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
	CALLR	LOCOI
	 JRST LOCNI0
	TSOUT	<[ASCIZ/ (/],LUTDSF,RPAREN>
	SKIPN	GBUF1
	 JRST	LOCNI4
	MOVE	X1,[440600,,LFILE]
	MOVEI	X2,6
	MOVE	X3,[440700,,FBUF]
LCNI12:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,LCNI12
LOCNI4:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[440600,,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[440700,,EBUF]
LCNI13:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,LCNI13
	ENDR
;LOCNFO LOCNO0

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR	<IO>
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	JUMPE	X1,RETN(0)
	MOVE	X2,[440700,,ABUF]
	MOVE	X3,[440700,,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[440700,,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	MOVEI	IO,ABUF
	CALLR	LUTFN
	TSOUT	<[ASCIZ/ (/],ABUF,RPAREN>
	ENDR
;LUTFN LUTFN1 LUTFN2 LUTFNT

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IO,BP,UTIL>
	HRRI	BP,(IO)
	HRLI	BP,440700
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
	SETZM LFILE+3
	MOVEI	X1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	X2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	CAIN	IO,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IO,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IO,77	;   AND REMOVAL OF HIGH BITS
	XCT	(X1)		; EXECUTE THE PROPER ROTATE
	IORM	IO,(X2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	X1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	X2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	X1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	X2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IO,-6	; HIGH ORDER
	ROT	IO,-14
	ROT	IO,22
	ROT	IO,14
	ROT	IO,6
	ROT	IO,0		; LOW ORDER
	ENDR
;LUTDS LUTDS1 LUTDS2 LUTDS3 LUTDSI LUTDSS LUTDSD LUTDSE

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
LUTDS1:	JSP X1,LUTDSI
	JUMPE X2,[	JSP X1,LUTDSI
			REPEAT ↑D14,<JSP X1,LUTDSI>
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE X3,[440700,,LUTDSF]
LUTDS2:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS2
	MOVEI X1,"."
	IDPB X1,X3
	JSP X1,LUTDSI
	ANDCMI X2,-1
LUTDS3:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS3
	SETZ X1,
	IDPB X1,X3
REPEAT ↑D14,<JSP X1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB X2,LDIBUF+1
	JRST (X1)
LUTDSS:	RELEAS	LDCHAN,
	MOVE	X1,LFIPPN
	MOVEM	X1,LDIR
	MOVE	X1,LFCHAS+1
	MOVEM	X1,LDCHAS+1
	MOVE	X1,[SIXBIT/UFD/]
	MOVEM	X1,LDIR+1
	SETZM	LDIR+2
	MOVE X1,[SIXBIT/  1  1/]
	MOVEM	X1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 OUTSTR	[ASCIZ/ ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR
;LUTTNS

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IO -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BP -- BYTE POINTER TO DESTINATION STRING
;   OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	MOVE	X1,IO
	IDIVI	X1,↑D31
	MOVEI	X3,(X1)
	MOVEI	X1,1(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D12
	MOVEI	X3,(X1)
	HRRI	X1,LUTTM(X2)
	HRLI	X1,440700
	SCOPY	(X1,BP)
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,↑D64(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1," "
	IDPB	X1,BP
	MOVE	X1,UTIL
	IDIVI	X1,↑D60
	MOVEI	X3,(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,":"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	SETZ	X1,
	IDPB	X1,BP
	ENDR
;LUTTSN LUTTM

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;   OUT: IO -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR	<BP>
	MOVE	BP,IO
	SETZ	IO,
	SETZ	UTIL,
	ILDB	X1,BP
	CAIL	X1,"0"
	 CAILE	X1,"9"
	  RETURN
	MOVEI	X4,-"0"(X1)
	IMULI	X4,↑D10
	ILDB	X1,BP
	ADDI	X4,-"0"(X1)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	MOVE	X3,[440700,,X2]
	SETZ	X2,
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	MOVEI	X3,↑D11
	IOR X2,[1004,,0]	; CANONICALIZE CASES
	CAME	X2,LUTTM(X3)
	 SOJGE	X3,.-1
	JUMPL	X3,RETN(0)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	ILDB	X1,BP
	MOVEI	X2,-"0"(X1)
	IMULI	X2,↑D10
	ILDB	X1,BP
	ADDI	X2,-"0"(X1)
	SUBI	X2,↑D64
	IMULI	X2,↑D12
	ADDI	X2,(X3)
	IMULI	X2,↑D31
	ADDI	X2,-1(X4)
	ILDB	X1,BP
	CAIE	X1," "
	 RETURN
	ILDB	X1,BP
	MOVEI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,6
	ILDB	X1,BP
	CAIE	X1,":"
	 RETURN
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	MOVE	IO,X2
	MOVE	UTIL,X3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII	/Jan/
	ASCII	/Feb/
	ASCII	/Mar/
	ASCII	/Apr/
	ASCII	/May/
	ASCII	/Jun/
	ASCII	/Jul/
	ASCII	/Aug/
	ASCII	/Sep/
	ASCII	/Oct/
	ASCII	/Nov/
	ASCII	/Dec/
;OOPS IOERDD IOERLF

; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE	IO,[IN DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[OUT DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[IN LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	MOVE	IO,[OUT LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	OUTSTR	[ASCIZ/ ?? Impossible event at /]
	MOVEI	IO,-1(FLAG)
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ / ??/]
	JRST SUICID
IOERDD:	GETSTS	DDCHAN,ABUF
	CAIA
IOERLF:	 GETSTS	LFCHAN,ABUF
	OUTSTR	[ASCIZ/ ?? Data error at /]
	MOVEI	IO,-3(FLAG)
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ/ with status /]
	MOVE	IO,ABUF
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ / ??
/]
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	JRST	QUIT
;CRLF RPAREN SEMI DCIBUF DCOBUF DDCHAS ZONKER DDIBUF DDOBUF LFIBUF LFOBUF ZONKEND XJOBFF LFIPPN LFILE LFCHAS LDIR LDCHAS LDIBUF LUTDSP LUTDSF EXABUF CONECB TERBLK STTBLK CMDMOD ANCHOR LOGIN% CONTEX OPENED OPENEM FLAGDD FLAGDE FLAGFE FLAGNN FLAGTT FLAGSM DEXA$L DEXA$P DEXA$S NBUF FBUF EBUF VBUF FSBUF ESBUF ABUF UBUF1 UBUF2 GBUF1 GBUF2 NTIME NSIZE NSUM TCIPCL TCIPLP TCIPNF STSIZ STBEG

SUBTTL Data area

CRLF:	BYTE (7)15,12,0,0,0
RPAREN:	BYTE (7)")",15,12,0,0
SEMI:	BYTE (7)";",15,12,0,0

	LIT			; LITERALS GO HERE

DCIBUF:	BLOCK 3
DCOBUF:	BLOCK 3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF

ZONKER==.
DDIBUF:	BLOCK 3
DDOBUF:	BLOCK 3
LFIBUF:	BLOCK 3
LFOBUF:	BLOCK 3
ZONKEND==.-1
XJOBFF:	BLOCK 1

LFIPPN:	0			; PPN
LFILE:	0			; FILE NAME
	0			; EXTENSION AND DATES
	0			; MODE AND DATES
	0			; SIZE IN WORDS
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK 3
LUTDSP:	0
LUTDSF:	BLOCK SBSIZE

EXABUF:	BLOCK SIZBLK

CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2

; * VARIABLES

CMDMOD:	0

ANCHOR:	ASCIZ /DFTP/
	BLOCK <SBSIZE-2>
LOGIN%:	BLOCK LBSIZE
CONTEX:	BLOCK LBSIZE
OPENED:	BLOCK LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGFE:	0
FLAGNN:	0
FLAGTT:	-1
FLAGSM: 0
DEXA$L:	0
DEXA$P:	0
DEXA$S:	0

; * BLOCKS

NBUF:	BLOCK LBSIZE
FBUF:	BLOCK SBSIZE
EBUF:	BLOCK SBSIZE
VBUF:	0
FSBUF:	BLOCK SBSIZE
ESBUF:	BLOCK SBSIZE

ABUF:	BLOCK SBSIZE
UBUF1:	BLOCK LBSIZE
UBUF2:	BLOCK SBSIZE
GBUF1:	BLOCK LBSIZE
GBUF2:	BLOCK LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK 100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK 37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK STSIZ

	VAR

	-1			; CRETIN LINK-10

END DFTP